getElementById的Java语言缩写


93

JavaScript document.getElementById有速记吗?还是有什么我可以定义的方法?它得到重复重复输入是超过


6
我不知道是谁打败了他们,但是一个不熟悉Javascript的人,他不知道如何创建这样的快捷方式,当他尝试将其与jQuery一起使用时,也可能遇到问题。 $变量不一致。正确的答案是:“不,原生Javascript不提供简写,但是有几个框架使选择DOM节点更加容易。”
kojiro 2011年

Answers:


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框架已经在使用$,恭喜您也选择了它?”
Piskvor在2011年

47
$如果您从不加载它们,那么使用多少个库也没有关系。
user113716 2011年

7
仅作记录,我曾经做过var $ = document.getElementById.bind(document),但bind并非在所有浏览器中都可用。也许它会更快,因为我只使用本机方法。只是想添加此。
pimvdb 2011年

7
@Piskvor:我从不编码以容纳无知。无知导致代码损坏。断码导致研究。研究导致信息。无知被治愈了。
user113716 2011年

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
绎(YI) -解开(简体中国)
AnnanFay

8
您确实意识到这对效率产生了合理的影响。原型上定义的getter / setter方法要慢一个数量级。
雷诺斯2011年

5
同样,这可能只是一个可见的字符,但是它将占用文件中的多个字节...
Alnitak

@Alnitak:哦,对,我还没想到。此外,有些人(如我)在键盘上没有¯¯键,因此他们将花费大量时间进行复制和粘贴。但是这个名字并不是很重要。最初,我将属性命名为“ e”(如元素),但是我认为这个名称已经可以被某些图书馆使用。
罗伯特

@Raynos:是的,在我的基准测试中,它的速度大约是常规函数的三倍。0.4µs * 3 = 1.2µs
Robert

18

您可以自己轻松创建简写:

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

@Sarfraz最好将其声明为变量或函数吗?有关系吗
user1431627 2013年

@ user1431627:如果用变量表示函数表达式,那么就范围而言确实很重要。我的答案中张贴的函数将在其执行上下文中随处可用。参见:stackoverflow.com/questions/1013385/…kangax.github.io/nfe
Sarfraz

@Sarfraz好吧,谢谢:) jQuery在可变范围内处理这个,对吗?我问的原因是因为最上面的答案是用变量范围编写的,但是您将其编写为正则函数表达式。
user1431627 2013年

13

一个快速的替代方法:

HTMLDocument.prototype.e = document.getElementById

然后做:

document.e('id');

有一个问题,它不能在不允许您扩展原型的浏览器中工作(例如IE6)。


2
@ walle1357:您可能会对本文感兴趣。
user113716 2011年

5
@ThiefMaster “永远不要X”是您可以提供的最差建议。了解替代方案,利弊,并针对每个特定问题选择最佳答案。在这种情况下扩展原型没有什么害处(尽管我应该说其他答案更合适,但这个答案只待完成)
Pablo Fernandez

您怎么知道它不会在某些浏览器中或将来破坏任何内容?
ThiefMaster

@PabloFernandez:您仍然不想扩展宿主对象。如果至少两个库要扩展具有相同名称的属性的宿主对象,则只有第一个仔细的库或最后一个粗心的库才能成功。
罗伯特

1
@Robert这显然不是最好的选择,但它一个选择。您需要考虑每个优点和缺点。请记住,客户端的JavaScript库开始与prototype.js这的确正是同样的事情。
Pablo Fernandez

8

(不仅可以通过ID获取元素,而且可以通过类: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")返回具有id的元素blah


6
您最好为创建一个快捷方式document.querySelectorAll,而不是尝试querySelectorAll在自定义函数中模拟方法的一部分。
罗伯W

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

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

7

ID已保存到中window

的HTML

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

JS

logo.innerHTML;

与写作相同:

document.getElementById( 'logo' ).innerHtml;

我不建议使用前一种方法,因为这是不常见的做法。


您能否详细说明为什么不建议使用此方法?
Okku 2015年

我不认为它曾经使用过,因为我不认为这是练习。但这是找到它的最短方法。
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 2011年

3
@patrick DW,右,你的答案$( 'someID')看上去一点也不像一个jQuery的ID选择$( '#someID'):)

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";

但是您仍然必须列出所有这些ID。

如果您想要所有具有id的元素,则可以进一步简化它:

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')

另外,我发现的另一个有用的技巧是,如果要获取项目ID的值或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包装器执行任何操作。

或者,如果您在浏览器开发人员控制台中使用此功能,请研究其内置实用程序。就像其他人提到的那样,Chrome JavaScript控制台包含一个$("someid")方法,您还可以在开发人员工具的“元素”视图中单击一个元素,然后$0从控制台中引用它。先前选择的元素变为$1依此类推。


1

如果这里唯一的问题是键入,也许您应该让自己成为一个具有intellisense的JavaScript编辑器。

如果目的是获得较短的代码,则可以考虑使用像jQuery这样的JavaScript库,也可以只编写自己的速记函数,例如:

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

我过去常常这样做是为了获得更好的性能。我去年了解到的是,利用压缩技术,服务器可以为您自动执行压缩,因此我的缩短技术实际上使我的代码更重了。现在,我很高兴输入整个document.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

箭头函数make较短。

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

您可以通过删除括号中的括号来进一步缩短它id
毛茸茸的

1

包装document.querySelectorAll ...像select这样的jquery

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

// usage: $('$myId')

哦,但这看起来有点难以使用。该函数可以返回未定义的HTMLElement或NodeList。当然,当您使用它通过其ID获取元素时,它$('#myId')通常应返回该HTMLElement,因为希望该ID恰好分配了一次。但是,如果将其用于可能与多个元素匹配的查询,则会变得很麻烦。
罗伯特·

0

好吧,如果元素的id不与全局对象的任何属性竞争,那么您不必使用任何函数。

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

编辑:但你希望利用这个“功能”的。


:(像浏览器侵犯我的声音告诉我在哪里,这是在HTML5规范有效。
Raynos

1
@Raynos:dev.w3.org/html5/spec/…但是:“这可能会改变。浏览器供应商正在考虑将这种行为限制为怪癖模式。” 虽然可以在我的FF4和IE8中使用。
罗伯特

2
是的,它现在可以正常工作,但是感觉很脏,而且如果它在年底被弃用,我也不会感到惊讶。
雷诺斯2011年

@Raynos我希望如此。我不喜欢浏览器污染全局名称空间。但是从另一方面来说,这并不是一件坏事。(当网页以html为中心并且javascript是一个不错的功能时)
罗伯特·罗伯特(Robert

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的好用法。获取需要eval的元素没​​有什么关系,您可以动态获取带有方括号表示法的属性。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ThatsNoMoon
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.