නාභිගත වී ඇති DOM මූලද්‍රව්‍යයට මා සොයා ගන්නේ කෙසේද?


1320

ජාවාස්ක්‍රිප්ට් හි දැනට අවධානය යොමු කර ඇති මූලද්‍රව්‍යය සොයා ගැනීමට මම කැමතියි. මම DOM හරහා සොයා බැලුවද මට අවශ්‍ය දේ තවමත් සොයාගෙන නොමැත. මෙය කිරීමට ක්‍රමයක් තිබේද, කෙසේද?

මම මෙය සොයන හේතුව:

මම උත්සාහ කරන්නේ ඊතල වැනි යතුරු සාදා enterආදාන මූලද්‍රව්‍ය වගුවක් හරහා සැරිසැරීමට ය. ටැබ් දැන් ක්‍රියාත්මක වේ, නමුත් ඇතුල් කරන්න, ඊතල පෙරනිමියෙන් නොපෙනේ. මට යතුරු හැසිරවීමේ කොටස සකසා ඇත, නමුත් දැන් සිදුවීම් හැසිරවීමේ කාර්යයන්හිදී අවධානය යොමු කරන්නේ කෙසේදැයි සොයා ගැනීමට මට අවශ්‍යය.


2
මූලද්රව්යය නාභිගත කරමින් console.log
ling

ඔබට find-focused-elementපැකේජය භාවිතා කළ හැකිය : npmjs.com/package/find-focused-element
මැක්සිම් ෂුකොව්

Answers:


1548

භාවිතා කරන්න document.activeElement, එය සියලුම ප්‍රධාන බ්‍රව්සර් වල සහය දක්වයි.

මීට පෙර, ඔබ අවධානය යොමු කර ඇති පෝරම ක්ෂේත්‍රය කුමක්දැයි සොයා ගැනීමට උත්සාහ කරන්නේ නම්, ඔබට නොහැකි විය. පැරණි බ්‍රව්සර් තුළ අනාවරනය අනුකරණය කිරීම සඳහා, සියලු ක්ෂේත්‍ර සඳහා “නාභිගත” සිදුවීම් හසුරුවන්නෙකු එකතු කර අවසන් වරට අවධානය යොමු කළ ක්ෂේත්‍රය විචල්‍යයක සටහන් කරන්න. අවසන් වරට නාභිගත වූ ක්ෂේත්‍රය සඳහා නොපැහැදිලි සිදුවීමක් මත විචල්‍යය ඉවත් කිරීමට "බොඳ" හසුරුවන්නෙකු එක් කරන්න.

ඔබට ඉවත් කිරීමට අවශ්‍ය නම් ඔබට activeElementබොඳවීම භාවිතා කළ හැකිය; document.activeElement.blur(). එය වෙනස් වනු ඇත activeElementකිරීමට body.

සබැඳි වෙබ් අඩවි:


53
IE ගැන විශ්වාස නැත, නමුත් FF සහ සෆාරි යන දෙකම BODY මූලද්‍රව්‍යය නැවත ලබා දෙයි.
ජේ.

10
activeElementඇත්ත වශයෙන්ම නාභිගත කළ මූලද්‍රව්‍යය නැවත ලබා නොදේ. ඕනෑම මූලද්රව්යයකට අවධානය යොමු කළ හැකිය. ලේඛනයක 'අනුචලන' 4 ක් තිබේ නම්, එම බෙදීම් වලින් 0 හෝ 1 ඊතල යතුරු මඟින් අනුචලනය කළ හැකිය. ඔබ එකක් ක්ලික් කළහොත්, එම අංශය යොමු වී ඇත. ඔබ සියල්ලෙන් පිටත ක්ලික් කළහොත්, ශරීරය නාභිගත වේ. කුමන අනුචලන කේන්ද්‍රගත වී ඇත්දැයි ඔබ සොයා ගන්නේ කෙසේද? jsfiddle.net/rudiedirkx/bC5ke/show (කොන්සෝලය පරීක්ෂා කරන්න)
රූඩි

18
Ud රූඩි, te ස්ටුවර්ට්: වඩාත් සවිස්තරාත්මක ක්‍රීඩා පිටියක් නිර්මාණය කිරීම සඳහා මම ඔබේ ෆෙඩල් එක මත ගොඩනගා ඇත: jsfiddle.net/mklement/72rTF . සැබවින්ම අවධානය යොමු කළ හැකි එකම ප්‍රධාන බ්‍රව්සරය (2012 අග වන විට) divෆයර්ෆොක්ස් 17 බව ඔබට පෙනී යනු ඇත, එය ටැබ් කිරීමෙන් පමණි. සියලුම ප්‍රධාන බ්‍රව්සර් හරහා නැවත පැමිණෙන මූලද්‍රව්‍ය වර්ග ආදාන සම්බන්ධිත මූලද්‍රව්‍යයන්ට document.activeElementසීමා වේ. එවැනි මූලද්‍රව්‍යයකට නාභිගත නොවන්නේ නම්, සියලුම ප්‍රධාන බ්‍රව්සරයන් මූලද්‍රව්‍යය නැවත ලබා දෙයි - IE 9 හැර, මූලද්‍රව්‍යය නැවත ලබා දෙයි . bodyhtml
mklement0

10
එය උපකාරී වේදැයි විශ්වාස නැත, නමුත් ටැබින්ඩෙක්ස් = "0" යන ගුණාංගය ඇතුළත් කිරීමෙන් ඔබට ඩිවි ලැබීමේ යතුරුපුවරුව වැනි අංගයක් සෑදිය හැකිය
මාකෝ ලුග්ලියෝ

4
ඕනෑම ප්‍රවේශයක් සමහර තත්වයන් යටතේ ව්‍යතිරේකයක් විසි document.activeElementකළ හැකි පරිදි ඔතා තිබිය යුතුය try catch(IE9 AFAIK පමණක් නොවේ). Bugs.jquery.com/ticket/13393 සහ bugs.jqueryui.com/ticket/8443
robocat

127

ජේ.ඩබ්ලිව් පැවසූ පරිදි, ඔබට අවම වශයෙන් බ්‍රව්සරයෙන් ස්වාධීන ආකාරයකින්වත් වර්තමාන නාභිගත කළ අංගය සොයාගත නොහැක. නමුත් ඔබගේ යෙදුම IE පමණක් නම් (සමහර ඒවා ...), ඔබට එය පහත ආකාරයෙන් සොයාගත හැකිය:

document.activeElement

සංස්කරණය කරන්න: IE හි සෑම දෙයක්ම වැරදී නැති බව පෙනේ, මෙය HTML5 කෙටුම්පතේ කොටසක් වන අතර අවම වශයෙන් Chrome, Safari සහ Firefox හි නවතම අනුවාදයෙන් සහය දක්වයි.


5
FF3 ද. මෙය සැබවින්ම "නාභිගත කළමනාකරණය" වටා ඇති HTML5 පිරිවිතරයේ කොටසකි.
ක්‍රෙසන්ට් නැවුම්

2
එය ක්‍රෝම් සහ ඔපෙරා හි වර්තමාන අනුවාදයේ (9.62) ක්‍රියා කරයි. OS X හි සෆාරි 3.2.3 හි ක්‍රියා නොකරයි, නමුත් එය ඊයේ නිකුත් කළ සෆාරි 4 හි ක්‍රියාත්මක වේ :)
ග්‍රෙගර්ස්

ක්‍රෝම් 19 සඳහා තවමත්
එසේමය

1
එය ක්‍රියා කරන්නේ ක්‍රෝම් (20) / සෆාරි (5.1.3) තුළ පමණි. ඔබ එය මත ක්ලික් කළහොත් jquery: නාභිගත තේරීම් කාරකය හෝ document.activeElement ඔබ ක්ලික් කළ දේ ආපසු ලබා දීමට සමත් නොවේ (පිළිවෙලින් නිර්වචනය නොකළ සහ ලේඛනගත ශරීර මූලද්‍රව්‍යය නැවත ලබා දීම). PS මට මෙම ත්‍රෙඩ් එක අවුරුදු 2 ක් පැරණි යැයි විශ්වාස කළ නොහැකි අතර වෙබ්කිට් හි ප්‍රතිගාමී ගැටලු තවමත් පවතී, මඟ හැරීම් සම්බන්ධතා ක්‍රියා නොකරන තැන සමඟ, නමුත් පර්යේෂණාත්මක css3 එකතු කිරීම සමඟ බොහෝ වැඩ කටයුතු සිදු වෙමින් පවතී. මගේ පවුලේ අයට සහ මිතුරන්ට ෆයර්ෆොක්ස් නිර්දේශ කිරීමට මම ආපසු යා හැකි යැයි සිතන්න.
ඩෝන්

area පෙළක් හෝ වෙනත් ආදානයක් වෙත අවධානය යොමු කිරීමට ඔබ ක්ලික් කළ විට document.activeElement හොඳයි. එය සබැඳියක් නම් එය ක්ලික් කළ විට අවධානය යොමු නොකරනු ඇත (පිටුවේ හෝ පැහැදිලිවම වෙනත් ආකාරයකින්).
markyzm

84

ඔබට jQuery භාවිතා කළ හැකි නම්, එය දැන් සහය දක්වයි: අවධානය යොමු කරන්න, ඔබ 1.6+ අනුවාදය භාවිතා කරන බවට වග බලා ගන්න.

මෙම ප්‍රකාශය මඟින් දැනට අවධානය යොමු කර ඇති අංගය ඔබට ලැබෙනු ඇත.

$(":focus")

සිට: jQuery සමඟ අවධානය යොමු කර ඇති මූලද්‍රව්‍යයක් තෝරා ගන්නේ කෙසේද


4
මෙය හොඳයි, නමුත් jQuery එය කරන්නේ කෙසේද? document.activeElement? මට මෙය හමු විය: return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
හැරී පෙකොනන්

46

document.activeElementදැන් HTML5 වැඩකරන කෙටුම්පත් පිරිවිතරයේ කොටසකි , නමුත් සමහර ප්‍රධාන නොවන / ජංගම / පැරණි බ්‍රව්සර් සඳහා එය තවමත් සහාය නොදක්වයි. ඔබට නැවත වැටිය හැකිය querySelector(එයට සහය දක්වන්නේ නම්). කිසිදු අංගයක් නාභිගත නොවන්නේ නම් document.activeElementඑය නැවත පැමිණෙන බව සඳහන් කිරීම වටී document.body- බ්‍රව්සර් කවුළුවේ නාභිගත නොවූවත්.

පහත කේතය මෙම ගැටළුව වටා ක්‍රියා කරන querySelectorඅතර මඳක් හොඳ සහායක් ලබා දෙනු ඇත.

var focused = document.activeElement;
if (!focused || focused == document.body)
    focused = null;
else if (document.querySelector)
    focused = document.querySelector(":focus");

සැලකිල්ලට ගත යුතු තවත් කරුණක් නම් මෙම ක්‍රම දෙක අතර කාර්ය සාධන වෙනසයි. තේරීම්කරුවන් සමඟ ලේඛනය විමසීම activeElementදේපල වෙත ප්‍රවේශ වීමට වඩා සෑම විටම මන්දගාමී වනු ඇත . මෙම jsperf.com පරීක්ෂණය බලන්න .


24

document.activeElementලේඛනය නාභිගත නොවන්නේ නම් තනිවම මූලද්‍රව්‍යයක් ආපසු ලබා දිය හැකිය (එබැවින් ලේඛනයේ කිසිවක් අවධානය යොමු නොකෙරේ !)

ඔබට එම හැසිරීම අවශ්‍ය විය හැකිය , නැතහොත් එය වැදගත් නොවනු ඇත (උදා: keydownසිදුවීමක් තුළ), නමුත් යමක් සත්‍ය වශයෙන්ම අවධානය යොමු වී ඇති බව දැන ගැනීමට ඔබට අවශ්‍ය නම්, ඔබට අතිරේකව පරීක්ෂා කළ හැකිය document.hasFocus().

පහත දැක්වෙන්නේ ඔබට කේන්ද්‍රීය අංගයක් තිබේ නම්, නැතහොත් null.

var focused_element = null;
if (
    document.hasFocus() &&
    document.activeElement !== document.body &&
    document.activeElement !== document.documentElement
) {
    focused_element = document.activeElement;
}

නිශ්චිත මූලද්‍රව්‍යයකට නාභිගත වී ඇත්දැයි පරීක්ෂා කිරීම සඳහා , එය සරල ය:

var input_focused = document.activeElement === input && document.hasFocus();

කිසිවක් නාභිගත වී ඇත්දැයි පරීක්ෂා කිරීම සඳහා , එය නැවත වඩාත් සංකීර්ණ වේ:

var anything_is_focused = (
    document.hasFocus() &&
    document.activeElement !== null &&
    document.activeElement !== document.body &&
    document.activeElement !== document.documentElement
);

ශක්තිමත් බව සටහන : එය පරීක්ෂා කරන කේතයේ document.bodyසහ document.documentElement, මෙයට හේතුව සමහර බ්‍රව්සර් මේවායින් එකක් ආපසු ලබා දීම හෝ nullකිසිවක් අවධානය යොමු නොකිරීමයි.

<body>(හෝ සමහර විට <html>) tabIndexගුණාංගයක් තිබුනේ නම් සහ එය ඇත්ත වශයෙන්ම අවධානය යොමු කළ හැකි නම් එය ගණන් නොගනී . ඔබ පුස්තකාලයක් හෝ යමක් ලියන්නේ නම් සහ එය ශක්තිමත් වීමට අවශ්‍ය නම්, ඔබ එය කෙසේ හෝ හැසිරවිය යුතුය.


අවධානය යොමු කරන ලද මූලද්‍රව්‍යය ලබා ගැනීමේ ( බර ගුවන් යානා) “එක්-ලයිනර්” අනුවාදය මෙන්න , එය කෙටි පරිපථ ගැන ඔබ දැන සිටිය යුතු නිසා සංකල්පමය වශයෙන් වඩාත් සංකීර්ණ වන අතර, එය පැහැදිලිවම එක් රේඛාවකට නොගැලපේ, ඔබ උපකල්පනය කරයි එය කියවිය හැකි වීමට අවශ්‍යයි.
මම මෙය නිර්දේශ නොකරමි. නමුත් ඔබ 1337 hax0r නම්, idk ... එය තිබේ. සමහර අවස්ථාවලදී ලබා ගැනීමට ඔබට අවශ්‍ය නැතිනම් ඔබට
එම || nullකොටස ඉවත් කළ හැකිය false. (ඔබ තවමත් ලබා ගත හැකි nullනම්, document.activeElementවේ null):

var focused_element = (
    document.hasFocus() &&
    document.activeElement !== document.body &&
    document.activeElement !== document.documentElement &&
    document.activeElement
) || null;

නිශ්චිත මූලද්‍රව්‍යයක් නාභිගත වී ඇත්දැයි පරීක්ෂා කිරීම සඳහා, විකල්පයක් ලෙස ඔබට සිදුවීම් භාවිතා කළ හැකිය , නමුත් මේ සඳහා සැකසුම අවශ්‍ය වේ (සහ ඉරීම විය හැකි), සහ වැදගත් ලෙස, ආරම්භක තත්වයක් උපකල්පනය කරයි :

var input_focused = false;
input.addEventListener("focus", function() {
    input_focused = true;
});
input.addEventListener("blur", function() {
    input_focused = false;
});

සිදුවීම් රහිත ක්‍රමය භාවිතා කිරීමෙන් ඔබට ආරම්භක රාජ්‍ය උපකල්පනය නිවැරදි කළ හැකිය, නමුත් ඔබට ඒ වෙනුවට එය භාවිතා කළ හැකිය.


15

document.activeElement<body>නාභිගත කළ හැකි මූලද්‍රව්‍යයන් නාභිගත නොවන්නේ නම් මූලද්‍රව්‍යයට පෙරනිමිය හැක . මීට අමතරව, මූලද්‍රව්‍යයක් නාභිගත වී බ්‍රව්සර් කවුළුව බොඳ වී activeElementඇත්නම්, නාභිගත කරන ලද මූලද්‍රව්‍යය දිගටම රඳවා ගනු ඇත.

මෙම හැසිරීම් දෙකෙන් එකක්වත් සුදුසු නොවේ නම්, CSS මත පදනම් වූ ප්‍රවේශයක් සලකා බලන්න : document.querySelector( ':focus' ).


සිසිල්, ඔව් මගේ කාරණයේදී ඔබේ ප්‍රවේශය නිරපේක්ෂ අර්ථයක් ඇති කළේය. මගේ අවධානය යොමු කළ හැකි අංග 'tabindex = "- 1"' සමඟ සැකසිය හැකිය, ඒවායින් කිසිවක් නාභිගත වී නොමැති නම් (කියමු, යම් පෙළක් හෝ පින්තූරයක්, මම ගණන් ගන්නේ නැත) document.querySelector (': නාභිගත කරන්න)) ශුන්‍යයි.
මැන්ෆ්‍රඩ්

භාවිතා නොකිරීමට මගේ පිළිතුර බලන්න querySelector: stackoverflow.com/a/40873560/2624876
1j01

10

මම ජොයෙල් එස් භාවිතා කළ ප්‍රවේශයට කැමතියි, නමුත් එහි සරලත්වයටද මම ප්‍රිය කරමි document.activeElement. මම jQuery භාවිතා කර දෙක ඒකාබද්ධ කළෙමි. සහාය නොදක්වන පැරණි බ්‍රව්සර් 'hasFocus' හි අගය ගබඩා document.activeElementකිරීමට භාවිතා jQuery.data()කරයි. නව බ්‍රව්සර් භාවිතා කරනු ඇත document.activeElement. මම හිතන්නේ එය document.activeElementවඩා හොඳ කාර්ය සාධනයක් ඇති කරයි.

(function($) {
var settings;
$.fn.focusTracker = function(options) {
    settings = $.extend({}, $.focusTracker.defaults, options);

    if (!document.activeElement) {
        this.each(function() {
            var $this = $(this).data('hasFocus', false);

            $this.focus(function(event) {
                $this.data('hasFocus', true);
            });
            $this.blur(function(event) {
                $this.data('hasFocus', false);
            });
        });
    }
    return this;
};

$.fn.hasFocus = function() {
    if (this.length === 0) { return false; }
    if (document.activeElement) {
        return this.get(0) === document.activeElement;
    }
    return this.data('hasFocus');
};

$.focusTracker = {
    defaults: {
        context: 'body'
    },
    focusedElement: function(context) {
        var focused;
        if (!context) { context = settings.context; }
        if (document.activeElement) {
            if ($(document.activeElement).closest(context).length > 0) {
                focused = document.activeElement;
            }
        } else {
            $(':visible:enabled', context).each(function() {
                if ($(this).data('hasFocus')) {
                    focused = this;
                    return false;
                }
            });
        }
        return $(focused);
    }
};
})(jQuery);

3
මෙය විලියම් ඩෙනිස් විසින් ප්‍රතිස්ථාපනය කළ $("*:focus")හැකිද?
පයිලිනක්ස්

මම හිතන්නේ ඒක වෙන්න පුළුවන්. මම මෙය බොහෝ කලකට පෙර ලියා ඇති අතර මීට වසර 5 කට පසුව වඩා හොඳ විසඳුමක් නැවත බැලීමට කිසි විටෙකත් හේතුවක් නොතිබුණි. එය අත්හදා බලන්න! මමත් එහෙම කරන්නම්. මම අපේ වෙබ් අඩවියේ ප්ලගිනය අඩුයි! :)
ජේසන්

10

මූටූල්ස් හි මෙම අරමුණු සඳහා මා භාවිතා කළ කුඩා සහායකයෙක්:

FocusTracker = {
    startFocusTracking: function() {
       this.store('hasFocus', false);
       this.addEvent('focus', function() { this.store('hasFocus', true); });
       this.addEvent('blur', function() { this.store('hasFocus', false); });
    },

    hasFocus: function() {
       return this.retrieve('hasFocus');
    }
}

Element.implement(FocusTracker);

මේ ආකාරයෙන් ඔබට ලබා දී ඇති මූලද්‍රව්‍යය වෙත el.hasFocus()සපයා ඇති මූලද්‍රව්‍යයේ අවධානය යොමු වී ඇත්දැයි පරීක්ෂා කළ හැකිය startFocusTracking().


8

ඔබට නිදසුනක් ලෙස වස්තුවක් ලබා ගැනීමට අවශ්‍ය නම් Element, ඔබ භාවිතා කළ යුතුය document.activeElement, නමුත් ඔබට නිදසුනක් ලෙස වස්තුවක් ලබා ගැනීමට අවශ්‍ය නම් Text, ඔබ භාවිතා කළ යුතුයdocument.getSelection().focusNode .

මම හිතනවා උදව් කරයි කියලා.


වඩා හොඳ කුමන ආකාරයෙන්ද?
1j01

ඔබගේ බ්‍රව්සරයේ පරීක්ෂක විවෘත කර, පිටුවේ ඕනෑම ස්ථානයක් මත ක්ලික් කරන්න, මෙය පසු document.getSelection().focusNode.parentElementකර Enter තට්ටු කරන්න. ඊට පසු, අතීතය document.activeElementහා එය සමාන කරන්න. ;)
rplaurindo

මෙම අදහස කොටුව, අවධානය යොමු සමඟ document.activeElementලබා දෙන අතර <textarea>ඇති ෙහයින්ද document.getSelection().focusNodeලබා දෙනවා, <td>මේ අඩංගු <textarea>(සහ document.getSelection().focusNode.parentElementලබා දෙනවා, <tr>අඩංගු <td>)
1j01

කණගාටුයි, මගේ සමාව. මම එය හොඳින් පැහැදිලි කළේ නැහැ. ඔබට නිදසුනක් ලෙස වස්තුවක් ලබා ගැනීමට අවශ්‍ය නම් Element, ඔබ එය භාවිතා කළ යුතුය document.activeElement, නමුත් ඔබට නිදසුනක් ලෙස වස්තුවක් ලබා ගැනීමට අවශ්‍ය නම් Text, ඔබ භාවිතා කළ යුතුය document.getSelection().focusNode. කරුණාකර, එය නැවත පරීක්ෂා කරන්න. මම හිතුවා මම උදව් කළා කියලා.
rplaurindo

2
ප්‍රශ්නය වන්නේ දැනට අවධානය යොමු කර ඇති මූලද්‍රව්‍යය කුමක්ද යන්නයි. තවද focusNodeඑය පෙළ නෝඩයක් බවට සහතික නොවේ.
1j01

8

දැනට අවධානය යොමු කර ඇති මූලද්‍රව්‍යය තීරණය කිරීමට උත්සාහ කිරීමේදී පහත සඳහන් ස්නිපටය ප්‍රයෝජනවත් බව මට පෙනී ගියේය. ඔබගේ බ්‍රව්සරයේ කොන්සෝලය තුළට පහත සඳහන් දෑ පිටපත් කරන්න, සෑම තත්පරයකම එය අවධානය යොමු කර ඇති වත්මන් මූලද්‍රව්‍යයේ තොරතුරු මුද්‍රණය කරනු ඇත.

setInterval(function() { console.log(document.querySelector(":focus")); }, 1000);

console.logසම්පූර්ණ මූලද්‍රව්‍යය මුද්‍රණය කිරීමෙන් ඔබට මූලද්‍රව්‍යය හඳුනා ගැනීමට උපකාරී නොවේ නම් නිශ්චිත මූලද්‍රව්‍යය නිශ්චය කර ගැනීමට ඔබට උදව් කිරීමට වෙනස් දෙයක් ඉවත් කිරීමට නිදහස් වන්න.


7

JQuery :focusවත්මන් අනුව ව්‍යාජ පන්තියට සහය දක්වයි . ඔබ එය JQuery ප්‍රලේඛනයෙන් සොයන්නේ නම්, එය "තේරීම්" යටතේ පරීක්ෂා කරන්න, එහිදී එය ඔබව W3C CSS ලියකියවිලි වෙත යොමු කරයි . මම ක්‍රෝම්, එෆ්එෆ් සහ අයිඊ 7+ සමඟ අත්හදා බැලුවෙමි. එය IE හි වැඩ කිරීමට නම්, <!DOCTYPE...html පිටුවේ තිබිය යුතු බව සලකන්න . අවධානය යොමු කර ඇති මූලද්‍රව්‍යයට ඔබ හැඳුනුම්පතක් ලබා දී ඇතැයි උපකල්පනය කරන උදාහරණයක් මෙන්න:

$(":focus").each(function() {
  alert($(this).attr("id") + " has focus!");
});

1
ඔබ (සැමවිටම?) this.idවෙනුවට භාවිතා කළ යුතුය $(this).attr('id'), හෝ අවම වශයෙන් (ඔබේ jQuery වස්තුව ඔබ සතුව ඇති විට) $(this)[0].id. මෙම මට්ටමේ ස්වදේශික ජාවාස්ක්‍රිප්ට් WAY වේගවත් හා වඩා කාර්යක්ෂම වේ. මෙම අවස්ථාවේ දී සැලකිය යුතු නොවිය හැකි නමුත් පද්ධතිමය වශයෙන් ඔබට වෙනසක් පෙනෙනු ඇත.
මාර්ටිජන්

6

Document.activeElement භාවිතා කිරීමේදී විභව ගැටළු තිබේ. සලකා බලන්න:

<div contentEditable="true">
  <div>Some text</div>
  <div>Some text</div>
  <div>Some text</div>
</div>

පරිශීලකයා අභ්‍යන්තර-බෙදීමක් කෙරෙහි අවධානය යොමු කරන්නේ නම්, document.activeElement තවමත් පිටත කොටස සඳහන් කරයි. අභ්‍යන්තර අංශයේ අවධානය යොමු වී ඇත්තේ කුමක් දැයි තීරණය කිරීමට ඔබට document.activeElement භාවිතා කළ නොහැක.

පහත දැක්වෙන ශ්‍රිතය මෙය වටා ඇති අතර නාභිගත කළ නෝඩය නැවත ලබා දෙයි:

function active_node(){
  return window.getSelection().anchorNode;
}

ඔබ අවධානය යොමු කළ අංගය ලබා ගැනීමට කැමති නම්, භාවිතා කරන්න:

function active_element(){
  var anchor = window.getSelection().anchorNode;
  if(anchor.nodeType == 3){
        return anchor.parentNode;
  }else if(anchor.nodeType == 1){
        return anchor;
  }
}

3
එය ඇත්ත වශයෙන්ම ගැටළුවක් නොවේ document.activeElement: ව්‍යාජ පංතිය දෘශ්‍යමාන දෙයකට <div>සැකසීම මඟින් ඔබට :focusදෘශ්‍යමාන ලෙස පෙනෙන පරිදි අභ්‍යන්තර මූලද්‍රව්‍යයන්ට සැබවින්ම අවධානය යොමු කළ නොහැක (උදාහරණ: jsfiddle.net/4gasa1t2/1 ). ඔබ කතා කරන්නේ අභ්‍යන්තරයේ <div>තේරීම හෝ කරත්තය අඩංගු වන අතර එය වෙනම ප්‍රශ්නයකි.
ටිම් ඩවුන්

5

වෙනත් පිළිතුරු කියවීම සහ මා උත්සාහ document.activeElementකිරීමෙන් බොහෝ බ්‍රව්සර්වල ඔබට අවශ්‍ය අංගය ලැබෙනු ඇත.

Document.activeElement සඳහා සහය නොදක්වන බ්‍රව්සරයක් ඔබ සතුව තිබේ නම්, ඔබට එය වටා ඉතා සරල දෙයක් සමඟ එය අවධානය යොමු කළ හැකිය (අත්හදා බැලිය නොහැකි බ්‍රවුසරයක් මා සතුව නොමැති හෙයින් එම නිර්ණායක සපුරා ගත හැකිය ):

if (typeof document.activeElement === 'undefined') { // Check browser doesn't do it anyway
  $('*').live('focus', function () { // Attach to all focus events using .live()
    document.activeElement = this; // Set activeElement to the element that has been focussed
  });
}

5

ඔබ jQuery භාවිතා කරන්නේ නම්, මූලද්‍රව්‍යයක් සක්‍රීය දැයි සොයා ගැනීමට ඔබට මෙය භාවිතා කළ හැකිය:

$("input#id").is(":active");


3

විසඳුම ලබා දීම සඳහා මෙය මෙහි තැබීමෙන් මා අවසානයේ ඉදිරිපත් විය.

මම document.activeInputArea නමින් දේපලක් නිර්මාණය කළ අතර ඊතල යතුරු, ටැබ් සහ ඇතුළත් කිරීම් සඳහා යතුරුපුවරු සිදුවීම් හසු කර ගැනීමට jQuery හි HotKeys ඇඩෝන භාවිතා කළ අතර ආදාන අංග මත ක්ලික් කිරීම සඳහා මම සිදුවීම් හසුරුවන්නෙකු නිර්මාණය කළෙමි.

අවධානය වෙනස් වූ සෑම අවස්ථාවකම මම ක්‍රියාකාරී ඉන්පුට්ආරියා සකස් කළෙමි, එබැවින් මා සිටින ස්ථානය සොයා ගැනීමට මට එම දේපල භාවිතා කළ හැකිය.

මෙය වළක්වා ගැනීම පහසුය, මන්ද ඔබට පද්ධතියේ දෝෂයක් තිබේ නම් සහ අවධානය ඔබ සිතන තැන නොවේ නම්, නිවැරදි අවධානය නැවත ලබා ගැනීම ඉතා අපහසුය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.