从任何jquery选择器字符串创建元素的最有效方法
Most efficient way to create an element from any jquery selector string
我需要做什么
我想创建一个匹配任何选择器字符串的元素
快速示例
var targetString = "a.exaggerated#selector[data-myattr='data-here']";
var targetEl = $(targetString);
if(!targetEl.length){
var newEl = //create target
$(body).append(newEl);
}
输出
<body>
<a class="exaggerated" id="selector" data-myattr="date-here"></a>
</body>
为什么
我有一些按钮,点击后会根据其数据属性执行不同的任务。其中之一是CCD_ 1。我希望能够使用ANY-sizzlejs/jquery选择器作为目标,如果dom中不存在目标元素,则创建它。例如
<button data-create-target="true" data-target=".mytarget">clickme</button>
<button data-create-target="true" data-target="a.[data-type='popup']">clickme</button>
我希望有一种方法可以使用jquery的选择器引擎来实现这一点,因为再次分析选择器字符串并提取其属性似乎很冗长。
非常感谢
这不是所有选择器都可以实现的,但如果您确信所提供的选择器可以工作,我会从以下内容开始:
function createElement(selector) {
var element = document.createElement('div');
if (/^[a-z][a-z0-9'-]*/.test(selector)) {
element = document.createElement(selector.match(/^[a-z][a-z0-9'-]*/)[0]);
}
// Wrap in jquery
element = $(element);
// Find the classes
if (/'.([a-z][a-z0-9'-]*)/g.test(selector)) {
selector.match(/'.([a-z][a-z0-9'-]*)/g).forEach(function (class) {
element.addClass(class.substr(1));
});
}
// Find the id
if (/#([a-z][a-z0-9'-]*)/.test(selector)) {
element.attr('id', selector.match(/#([a-z][a-z0-9'-]*)/)[0]);
}
// Find the attributes
if (/'[([a-z][a-z0-9'-]*)=''(.+)''']/) {
var match = /'[([a-z][a-z0-9'-]*)=''(.+)''']/.exec(selector);
element.attr(match[1], match[2]);
}
return element;
}
我创建了一个插件来解决这个问题。
$("a.exaggerated#selector[data-myattr='data-here']").create().appendTo('body');
jquery 2.1.1版和obove需要访问$.find.tokenize方法
$.fn.create = function( elem, dataAndEvents, deepDataAndEvents ) {
if(this.length){
return $(this).clone( elem, dataAndEvents, deepDataAndEvents );
} else {
var selector = this.selector;
var rquickExpr = /^(?:#(['w-]+)|('w+)|'.(['w-]+))$/;
var match, elem, m;
if(!selector){
return $(document.createElement('div'));
}
if(match = rquickExpr.exec( selector )){
if ( match[2] ) {
return $(document.createElement(selector));
} else {
var elem = document.createElement('div');
if ( (m = match[1]) ) {
elem.id = m;
} else if ( (m = match[3])) {
elem.className = m ;
}
return $(elem);
}
}
selector = selector.replace( rtrim, "$1" );
match = $.find.tokenize(selector);
if ( match.length === 1 ) {
var attrs = '';
var tag = 'div';
var classList = [];
var type, value, matches;
var tokens = match[0] = match[0].slice( 0 );
for (var i = 0; i < tokens.length; i++) {
type = tokens[i].type;
value = tokens[i].value
matches = tokens[i].matches;
if ( type === "ID" ){
attrs += 'id="' + matches[0] + '" ';
continue;
}
else if ( type === "CLASS" ){
classList.push(matches[0]+matches[1]+matches[2]);
continue;
}
else if ( type === "TAG" ){
tag = matches[0];
continue;
}
else if ( type === "ATTR" ){
attrs += matches[0]+ (matches[1] ? matches[1] : '' ) + (matches[2] ? '"' + matches[2] + '"': '' )+ ' ';
}
else if ( type === "PSEUDO" ){
}
else if ( type === "CHILD" ){
}
};
if(classList.length){
attrs += 'class="';
for (var i = 0; i < classList.length; i++) {
attrs += classList[i] + ' ';
};
attrs += '"';
}
return $('<' + tag + ' ' + attrs + '></' + tag + '>');
}
return $(document.createElement('div'));
}
}
相关文章:
- 在jQuery中创建向下滑动子菜单的最有效方法
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 选择具有值数组的所有元素的最有效方法
- 将JSON存储和恢复到此Ionic应用程序的最有效方法
- 将javascript数组中的项移动到特定位置的有效方法
- 将JS对象数组转换为嵌套形式的最有效方法
- 隐藏具有特定类$.each、for等的元素的有效方法
- 什么's是调用具有可变参数的函数的有效方法
- 选择具有特定数据的所有 html 标记的最有效方法是什么 - [适当性],无论值如何
- 使用 jQuery 调用 PHP 端点的最有效方法
- 这是解析 Int 的有效方法吗?
- 在JavaScript中搜索数组映射的最有效方法
- 获取字符串中最后一个换行符的最有效方法是什么
- 什么's是在两个(或多个)阵列中找到匹配的细胞序列的最有效方法
- 什么's是在IE8+中添加元素的最有效方法
- 从任何jquery选择器字符串创建元素的最有效方法
- 在日期范围内查找丢失日期的最有效方法是什么
- 对区间[1,10^12]中的整数进行编码/解码的快速有效方法是什么
- 在条件(if)结构的条件语句中是否有定义变量的有效方法
- 在ASP.NET中使用JQuery UI自动完成的有效方法