0

http://jsfiddle.net/DerNalia/zrppg/8/

我有两行代码几乎做同样的事情

var doesntbreak = $j("hello");
var breaks = $j(" "); 

第一个没有错误,但第二个抛出这个

  Syntax error, unrecognized expression:  

他们不应该表现得一样吗?

关于如何解决这个问题的任何见解?在我使用的实际方法中,ele它来自 Dom,因此它可以是文本节点或任何其他类型的节点。

更新:

我注意到我正在使用的函数的输入是从dom中选择的。更新示例: http: //jsfiddle.net/DerNalia/zrppg/11/ <-包括 html 标记。

所以,我想,我的问题是,我如何测试某个东西是否只是一个文本节点?并且不包含任何标记?

4

5 回答 5

1

try this:

function isTextNode(node){
    div=document.createElement('div');
    div.innerHTML=node;
    return $(div).text()==$(div).html();
}

And "&nbsp;" is'nt a valid selector if you want to find a elements containing some text you must use the :contains selector http://api.jquery.com/contains-selector/

于 2012-07-09T14:44:10.623 回答
1

通常,您不能使用 jQuery 函数创建独立的文本节点。如果一个字符串显然不是 HTML,它会被视为一个选择器,并且&nbsp;不会被 jQuery 识别为一个有效的选择器。

假设您想解析任意字符串(可能有 HTML 标签或没有),我建议像var result = $('<div></div>').html('&nbsp;').contents();. 将您的 HTML 或文本字符串放在 div 中进行解析,然后立即将解析结果提取为带有元素列表的 jQuery 对象。您可以将生成的元素列表附加为$(parentElem).append(result);

于 2012-07-09T14:43:11.400 回答
0

Internet Explorer(至少是旧版本)没有内置的“querySelector”功能,所以 Sizzle 引擎必须直接完成这项工作。因此,虚假输入的稍微不同的容差可能会导致错误报告的差异。

但是,您的选择器表达式"&nbsp;"在所有浏览器中同样无效。库没有义务悄悄地接受你传递给它的任何东西,所以也许你应该重新考虑你的应用程序设计。

如果您想检查实体,如果您确信它只是一个文本节点,则可以使用正则表达式。或者您可以使用.text()而不是获取内容.html()

于 2012-07-09T14:30:39.133 回答
0

不是实际答案,但可以帮助与我有类似问题且与此问题相关的人。:)

我今天遇到了同样的问题,所以通过删除来解决&nbsp;

改变:

var breaks = $j("&nbsp;");

至:

var breaks = $j("&nbsp;".replace(/&.*;/g, ""));

在这里,我正在删除&nbsp;&lt;...

注意:价值&nbsp;对我来说是动态的,所以它可以是任何东西。

于 2014-05-09T01:48:15.007 回答
0

所以,我必须感谢ApsillersRolando为我指明了正确的方向。他们的回答非常接近,但给了我所需的信息。

这就是我最终使用的:

TEXT_NODE = 3;
objectify = function(n) {
    return $j("<div></div>").html(n).contents();
}

function textOnly(n) {
    var o = objectify(n);
    for (var i = 0; i < o.length; i++) {
        if (objectify(o[i])[0].nodeType != TEXT_NODE) {
            return false
        }
    }
    return true;
}

这是一个

jsFiddle

对于一些测试用例,原始代码提交都没有通过。

要通过,它需要处理这种输入

"hello" // true
"hello<b>there</b>" // false
"<b>there</b>" // false
"&nbsp;" // false
于 2012-07-09T17:57:03.417 回答