jQuery“获取或创建元素”的便捷方法
我有两个生成DOM元素的函数。 它们都试图创建相同的容器元素。 (我不想强制执行这些函数的特定运行顺序,或者将它们紧密地联系到创建此元素的副作用)。 我一直在尝试发现一个方法,如果它存在,将获得一个元素,或者如果它不存在则创建它的单个实例,并返回包含该元素的jQuery对象或所有匹配的元素(如果它们已经存在)。
我没有发现这在搜索jQuery文档中存在,但我想我会问这里是否有其他人遇到过类似问题并有建议。
您可以使用这个写得不好的代码:
var $element = $('#element').length ? $('#element') : $('').appendTo('#containerToPutIt');
或者让它更清洁:
var $element = $('#element'); if(!$element.length) $element = $('').appendTo('#containerToPutIt');
在jQuery中确实没有一个地方可以保证有足够的信息来创建一个元素(如果它不存在)。 例如,如果你做$('#something')
,并且你希望jQuery确保它存在,你期望jQuery创建什么元素? 你想把它放在DOM里的哪个位置?
这是你应该使用辅助方法做的事情:
function getContainer() { var container = $('.yourContainer'); if (!container.length) { container = $('').appendTo('#something'); } return container; }
然后像这样使用它:
getContainer().html('Foo Bar Baz'); getContainer().children().each(..);
你可以在jQuery中选择DOM元素,然后测试它的长度:
if ($('div.someclass').length > 0) {...}
不要测试jQuery对象的存在 ,因为即使它内部没有DOM元素,它也总是返回true
。 你必须经常测试它的长度。
如果length
测试失败,则可以使用适当的DOM插入方法在任何位置创建DOM元素。
嗯…有趣的问题……你可能会尝试类似的东西。
function checkExists(selector) { var exists = $(selector).length; if(exists > 0) { return $(selector); } else { return createElement(); } }
其中createElement()
将是您正在寻找的DOM元素的函数。 (它会返回新创建的元素)然后你可以用一个jquery选择器来调用它,比如checkExists('.myClass');
例如
让方便的方法是方便(除了保持关注点分离!!这里有一个标题为upsert
的jQuery函数,它将定位现有元素或创建一个新元素(如果不存在)。
所以只需在任何地方包含这个jQuery:
$.fn.upsert = function(selector, htmlString) { // upsert - find or create new element // find based on css selector https://api.jquery.com/category/selectors/ // create based on jQuery() http://api.jquery.com/jquery/#jQuery2 var $el = $(this).find(".message"); if ($el.length == 0) { // didn't exist, create and add to caller $el = $(""); $(this).append($el); } return $el; };
然后你可以像这样使用:
$("input[name='choice']").click(function(){ var $el = $(this).closest("form").upsert(".message", ""); // guaranteed to have element - update if we want $el.html("You've chosen "+this.value) })
理想情况下,简单地传入一个选择器并让jQuery创建一个自动匹配该选择器的元素会很好,但似乎没有一个轻量级的工具来创建一个基于CSS Selector语法的元素 (基于问题) 1和问题2 )。
一些进一步的增强可能会为DOM插入提供更精细的调整控制,而不是总是使用.append()
。
演示jsFiddle | Stack Snippets中的演示:
$.fn.upsert = function(selector, htmlString) { // upsert - find or create new element // find based on css selector https://api.jquery.com/category/selectors/ // create based on jQuery() http://api.jquery.com/jquery/#jQuery2 var $el = $(this).find(".message"); if ($el.length == 0) { // didn't exist, create and add to caller $el = $(""); $(this).append($el); } return $el; }; $("input[name='choice']").click(function(){ var $el = $(this).closest("form").upsert(".message", ""); // guaranteed to have element - update if we want $el.html("You've chosen "+this.value) });