Javascript скорочення для getElementById


93

Чи існує якийсь скорочений текст для документа JavaScript.getElementById? Або я можу визначити такий спосіб? Це отримує повторювані перетискання, які знову і знову .


6
Я не знаю, хто їх проголосував, але той, хто недостатньо знайомий з Javascript і не знає, як створювати подібні ярлики, також, мабуть, загрожує проблемами, коли намагається використовувати його, скажімо, з jQuery, і виявляє, що змінна $ не узгоджується. Правильна відповідь - «Ні, в основному Javascript не пропонує скорочення, але є кілька рамок, які полегшують вибір вузлів DOM».
— якийro

Відповіді:


126
var $ = function( id ) { return document.getElementById( id ); };

$( 'someID' )

Тут я використовував $, але ви можете використовувати будь-яке дійсне ім'я змінної.

var byId = function( id ) { return document.getElementById( id ); };

byId( 'someID' )

6
@patrick dw Мені це подобається. Особливо з багатством дійсних імен змінних там :)
— Fox Wilson

4
"з багатством дійсних імен змінних" - ви маєте на увазі "принаймні дві основні рамки JS вже використовуються. $Вітаю, що також вибрали це?"
— Пісквор залишив будівлю

47
Не має значення, скільки бібліотек використовують, $якщо ви ніколи не завантажуєте їх.
— user113716

7
Просто для запису, я раніше робив var $ = document.getElementById.bind(document), але bindдоступний не у всіх браузерах. Можливо, це швидше, адже я використовую лише власні методи. Просто хотів додати це.
— pimvdb

7
@Piskvor: Я ніколи не кодую, щоб пристосувати незнання. Незнання призводить до непрацюючого коду. Поламаний код призводить до досліджень. Дослідження ведуть до інформації. Невігластво виліковується.
— user113716

85

Щоб зберегти зайвий символ, ви можете забруднити прототип String так:

pollutePrototype(String, '绎', {
    configurable: false, // others must fail
    get: function() {
        return document.getElementById(this);
    },
    set: function(element) {
        element.id = this;
    }
});

function pollutePrototype(buildIn, name, descr) {
    var oldDescr = Object.getOwnPropertyDescriptor(buildIn.prototype, name);
    if (oldDescr && !oldDescr.configurable) {
        console.error('Unable to replace ' + buildIn.name + '.prototype.' + name + '!');
    } else {
        if (oldDescr) {
            console.warn('Replacing ' + buildIn.name + '.prototype.' + name + ' might cause unexpected behaviour.');
        }
        Object.defineProperty(buildIn.prototype, name, descr);
    }
}

Це працює в деяких браузерах, і ви можете отримати доступ до елементів таким чином:

document.body.appendChild(
    'footer'.绎 = document.createElement('div')
);
'footer'.绎.textContent = 'btw nice browser :)';

Я вибрав назву власності майже випадково. Якщо ви насправді хотіли скористатися цією стенограмою, я б запропонував створити щось простіше.


12
绎 (Yì) - Unravel (спрощена китайська)
— AnnanFay

8
Ви усвідомлюєте, що це вимагає розумного удару по ефективності. Геттер / сеттери, визначені на прототипі, на порядок повільніші.
— Райнос,

5
також, це може бути лише один видимий символ, але це займе більше одного байта у файлі ...
— Alnitak

@Alnitak: о, так, я не думав про це. Крім того, деякі люди (як я) не мають клавіші 绎 на своїх клавіатурах, тому вони витратили б багато часу на її копіювання та вставлення. Але ім’я насправді не важливо. Спочатку я назвав властивість 'e' (подібно до елемента), але я думав, що це ім'я вже може бути заявлено деякою бібліотекою.
— Роберт

@Raynos: Так, у моєму тесті це приблизно втричі повільніше, ніж звичайна функція. 0,4 мкс * 3 = 1,2 мкс
— Роберт

18

Ви можете легко легко створити стенографію:

function getE(id){
   return document.getElementById(id);
}

@Sarfraz Чи найкраще оголосити це змінною чи функцією? Це навіть має значення?
— user1431627

@ user1431627: Якщо під змінною ви мали на увазі вираз функції, то це має значення з точки зору обсягу. Функція, розміщена у моїй відповіді, буде доступна скрізь у контексті її виконання. Див: stackoverflow.com/questions/1013385 / ... або kangax.github.io/nfe
— Сарфраза

@Sarfraz Добре, дякую :) jQuery обробляє це у змінному масштабі, так? Причина, по якій я запитую, полягає в тому, що відповідь у верхній частині написана із змінним обсягом, але ви написали її як звичайний вираз функції.
— user1431627

13

Швидка альтернатива внеску:

HTMLDocument.prototype.e = document.getElementById

Тоді просто виконайте:

document.e('id');

Існує фішка: вона не працює у браузерах, які не дозволяють розширювати прототипи (наприклад, IE6).


2
@ walle1357: Ця стаття може вас зацікавити.
— user113716

5
@ThiefMaster "Ніколи не роби X" - це найгірша порада, яку ти можеш дати. Знайте альтернативи, плюси та мінуси та виберіть найкращу відповідь на кожну конкретну проблему. У цьому випадку розширення прототипу не зашкодить (хоча я повинен сказати, що інші відповіді підходять краще, цей залишається лише для завершення)
— Пабло Фернандес,

Звідки ви знаєте, що це нічого не зламає в якомусь браузері чи в майбутньому?
— ThiefMaster

@PabloFernandez: Ви все одно не хочете розширювати об'єкти хоста. Якщо принаймні дві бібліотеки хочуть розширити об'єкт хоста з властивостями з однаковим іменем, тоді успішною буде лише перша обережна бібліотека або остання необережна бібліотека.
— Роберт

1
@Robert це явно не найкращий варіант, але це варіант. Потрібно враховувати плюси і мінуси кожного. Пам’ятайте, що бібліотеки JavaScript на стороні клієнта починалися з того, prototype.jsщо робило саме те саме.
— Пабло Фернандес,

8

(Стенографія не тільки отримання елемента за ідентифікатором, але й отримання елемента за класом: P)

Я використовую щось на зразок

function _(s){
    if(s.charAt(0)=='#')return [document.getElementById(s.slice(1))];
    else if(s.charAt(0)=='.'){
        var b=[],a=document.getElementsByTagName("*");
        for(i=0;i<a.length;i++)if(a[i].className.split(' ').indexOf(s.slice(1))>=0)b.push(a[i]);
        return b;
    }
}

Використання: _(".test")повертає всі елементи з іменем класу testта _("#blah")повертає елемент з ідентифікатором blah.


6
Вам краще створити ярлик для document.querySelectorAll, замість того, щоб намагатися емулювати частину querySelectorAllметоду в користувацькій функції.
— Роб W

7
<script>
var _ = function(eId)
{
    return getElementById(eId);
}
</script>

<script>
var myDiv = _('id');
</script>

7

ідентифікатори зберігаються в window.

HTML

 <div id='logo'>logo</div>

JS

logo.innerHTML;

це те саме, що писати:

document.getElementById( 'logo' ).innerHtml;

Я не пропоную використовувати попередній метод, оскільки це не є звичайною практикою.


Не могли б ви детальніше пояснити, чому б ви не пропонували використовувати цей метод?
— Окку

Я не бачу, щоб він коли-небудь використовувався, оскільки не думаю, що це практика ставок. Але це найкоротший спосіб його знайти.
— im_benton

@Okku, тому що <div id="location"></div>дзвінки window.locationне спрацюють .
— Олексій

6

Тут є кілька хороших відповідей, і кілька танцюють навколо синтаксису, подібного до jQuery, але жоден не згадує насправді про використання jQuery. Якщо ви не проти спробувати, перевірте jQuery . Це дозволить вам вибрати елементи дуже легко, як це ..

За ідентифікатором :

$('#elementId')

За класом CSS :

$('.className')

За типом елемента :

$('a')  // all anchors on page 
$('inputs')  // all inputs on page 
$('p a')  // all anchors within paragaphs on page 

3
Я спробував jQuery, але чи справді мені потрібна ціла бібліотека лише для скороченого тексту getElementById?
— Фокс Вілсон,

Який "jQuery-подібний синтаксис" в інших відповідях? Здебільшого це просто звичайні старі функції, на які посилаються змінні. У цьому немає нічого унікального jQuery-подібного. ; o)
— user113716

3
@patrick dw, Вірно, ваша відповідь $ ('someID') не схожа на селектор jQuery ID $ ('# someID') :)
— Kon

5

Вбудованого немає.

Якщо ви не проти забруднити глобальний простір імен, чому б і ні:

function $e(id) {
    return document.getElementById(id);
}

РЕДАГУВАТИ - Я змінив назву функції на щось незвичне , але коротке і не зіткнене з jQuery чи іншим, що використовує голий $знак.


3

Так, повторюється використання однієї і тієї ж функції знову і знову кожного разу з різним аргументом:

var myImage = document.getElementById("myImage");
var myDiv = document.getElementById("myDiv");

Тож гарною річчю була б функція, яка приймає всі ці аргументи одночасно:

function getElementsByIds(/* id1, id2, id3, ... */) {
    var elements = {};
    for (var i = 0; i < arguments.length; i++) {
        elements[arguments[i]] = document.getElementById(arguments[i]);
    }
    return elements;
}

Тоді у вас будуть посилання на всі ваші елементи, що зберігаються в одному об’єкті:

var el = getElementsByIds("myImage", "myDiv");
el.myImage.src = "test.gif";

Але вам все одно доведеться перерахувати всі ці ідентифікатори.

Ви можете спростити це ще більше, якщо хочете всі елементи з ідентифікаторами:

function getElementsWithIds() {
    var elements = {};
    var elementList = document.querySelectorAll("[id]");
    for (var i = 0; i < elementList.length; i++) {
        elements[elementList[i].id] = elementList[i];
    }
    return elements;
}

Але було б досить дорого викликати цю функцію, якщо у вас багато елементів.


Отже, теоретично, якщо ви використовуєте withключове слово, ви можете написати такий код:

with (getElementsByIds('myButton', 'myImage', 'myTextbox')) {
    myButton.onclick = function() {
        myImage.src = myTextbox.value;
    };
}

Але я не хочу сприяти використанню with. Можливо, є кращий спосіб це зробити.


2

Ну, ви могли б створити скорочену функцію, ось що я роблю.

function $(element) {
    return document.getElementById(element);
}

а потім, коли ти захотів його отримати, ти просто робиш

$('yourid')

Крім того, ще один корисний трюк, який я знайшов, полягає в тому, що якщо ви хочете отримати значення або innerHTML ідентифікатора елемента, ви можете зробити такі функції:

function $val(el) {
    return $(el).value;
}

function $inner(el) {
    return $(el).innerHTML;
}

Сподіваюся, вам сподобається!

Я насправді створив своєрідну міні-бібліотеку javascript на основі всієї цієї ідеї. Ось воно.


Я просто дивився на це питання ще раз і знайшов це. Це досить акуратна бібліотека, якщо ви не хочете включати весь jQuery.
— Фокс Вілсон,

2

Я часто використовую:

var byId='getElementById'
var byClass='getElementsByClass'
var byTag='getElementsByTag'


var mydiv=document[byId]('div') 
/* as document["getElementById"] === document.getElementById */

Я думаю, що це краще, ніж зовнішня функція (наприклад, $()або byId()), тому що ви можете робити такі речі:

var link=document[byId]('list')[byClass]('li')[0][byTag]('a')[0]


До речі, не використовуйте для цього jQuery, jQuery набагато, набагато повільніше, ніж document.getElementById()зовнішня функція, подібна $()або byId(), або мій метод: http://jsperf.com/document-getelementbyid-vs-jquery/5


1

Якщо це на вашому власному сайті, подумайте про використання бібліотеки, як jQuery, щоб дати вам цей та багато інших корисних скорочень, які також абстрагують відмінності браузера. Особисто, якби я написав достатньо коду, щоб мене турбував лонгхенд, я б включив jQuery.

У jQuery синтаксис буде $("#someid"). Якщо тоді вам потрібен фактичний елемент DOM, а не обгортка jQuery, це так $("#someid")[0], але ви, швидше за все, можете робити все, що вам потрібно, з обгорткою jQuery.

Або, якщо ви використовуєте це в консолі розробника браузера, досліджуйте їх вбудовані утиліти. Як хтось уже згадував, консоль JavaScript JavaScript включає $("someid")метод, а також ви можете натиснути елемент у вікні розробника "Елементи", а потім посилатися на нього з $0консолі. Вибраний раніше елемент стає $1тощо.


1

Якщо єдине питання тут - це введення тексту, можливо, вам просто слід отримати собі редактор JavaScript з intellisense.

Якщо мета - отримати коротший код, ви можете розглянути бібліотеку JavaScript, як jQuery, або ви можете просто написати свої власні функції скорочень, наприклад:

function byId(string) {return document.getElementById(string);}

Раніше я робив вищезазначене для кращої роботи. Що я дізнався минулого року, це те, що за допомогою методів стиснення сервер робить це автоматично для вас, тому моя техніка скорочення насправді зробила мій код важчим. Тепер я просто задоволений введенням цілого документа. GetElementById.


1

Якщо ви запитуєте скорочену функцію ...

<!DOCTYPE html>
<html>

<body>
The content of the body element is displayed in your browser.
<div id="d1">DIV</div>
<script>
var d=document;
d.g=document.getElementById;
d.g("d1").innerHTML = "catch";
</script>
</body>

</html>

або

<!DOCTYPE html>
<html>

<body>
The content of the body element is displayed in your browser.
<div id="d1">DIV</div>
<script>
var w=window;
w["d1"].innerHTML = "catch2";
</script>
</body>


1

Функції стрілок роблять коротшими.

var $id = (id) => document.getElementById(id);

Можна ще більше скоротити її, видаливши круглі дужки, що додаються до idаргументу.
— Кудлатий

1

оберніть document.querySelectorAll ... такий jquery, як select

function $(selector){
   var s = document.querySelectorAll(selector); 
   return s.length > 1 ? s : s[0];
}

// usage: $('$myId')

О, але з цим виглядає трохи складно працювати. Функція може повертати невизначений, HTMLElement або NodeList. Звичайно, коли ви використовуєте його для отримання елемента за його ідентифікатором, $('#myId')він зазвичай повинен повертати цей HTMLElement, тому що, сподіваємось, ви присвоїли цей ідентифікатор рівно один раз. Але якщо ви використовуєте його з запитами, які можуть збігатися з кількома елементами, це стає громіздко.
— Роберт

0

Ну, якщо ідентифікатор елемента не конкурує з будь-якими властивостями глобального об'єкта, вам не доведеться використовувати жодну функцію.

myDiv.appendChild(document.createTextNode("Once I was myDiv. "));
myDiv.id = "yourDiv";
yourDiv.appendChild(document.createTextNode("But now I'm yourDiv."));

редагувати: Але ви не хочете використовувати цю "функцію".


:( Це для мене звучить як зловживання браузером. Покажіть, де це справедливо в специфікації HTML5.
— Рейнос

1
@Raynos: dev.w3.org/html5/spec/… Але: "Можливо, це зміниться. Постачальники браузерів розглядають можливість обмежити цю поведінку режимом химерності." Працює в моїх FF4 та IE8.
— Роберт,

2
так, це працює прямо зараз, але він відчуває себе брудним, і я б не здивувався, якщо до кінця року це буде припинено.
— Raynos

@Raynos Я сподіваюся, що так. Мені не подобається, що браузери забруднюють глобальний простір імен. Але з іншого боку, це було не так вже й погано, коли це було винайдено. (коли веб-сторінки були орієнтовані на html, і javascript був приємною особливістю)
— Роберт,

0

Ще одна обгортка:

const IDS = new Proxy({}, { 
    get: function(target, id) {
        return document.getElementById(id); } });

IDS.camelCaseId.style.color = 'red';
IDS['dash-id'].style.color = 'blue';
<div id="camelCaseId">div 1</div>
<div id="dash-id">div 2</div>

Це, якщо ви не хочете використовувати немислиме , див. Вище.


-1

Я написав це вчора і знайшов це дуже корисним.

function gid(id, attribute) {
    var x = 'document.getElementById("'+id+'")';
    if(attribute) x += '.'+attribute;
    eval('x =' + x);
    return x;
}

Ось як ти ним користуєшся.

// Get element by ID
   var node = gid('someID'); //returns <p id='someID' class='style'>Hello World</p>

// returns 'Hello World'
// var getText = document.GetElementById('someID').innerText; 
   var getText = gid('someID', 'innerText'); 

// Get parent node
   var parentNode = gid('someID', 'parentNode');

Це невдале використання eval. У отриманні елемента, який потребує оцінки, немає нічого, і ви можете динамічно отримати властивість із позначеннями в дужках. Див. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
— ThatsNoMoon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.