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.