繁体   English   中英

jQuery Selector转义冒号“:”在IE中有效但在其他地方不起作用

[英]jQuery Selector escaping colon “:” works in IE but does not work elsewhere

我有一个XSL对象。 我想提取一组选定的节点。 另一个人或团队编写了XSL文档和选择这些节点的代码行,但它只适用于IE,我试图使其跨浏览器兼容。

XSL文件

<!-- snippet of XSL file -->
<xsl:variable name="title">aaa</xsl:variable>

<xsl:variable name="col1">CSV00001</xsl:variable>
<xsl:variable name="col2">CSV00002</xsl:variable>
<xsl:variable name="col3">CSV00003</xsl:variable>
<xsl:variable name="col4">CSV00004</xsl:variable>
<xsl:variable name="col5">CSV00005</xsl:variable>
<xsl:variable name="col6">CSV00006</xsl:variable>
<xsl:variable name="col7">CSV00007</xsl:variable>
<xsl:variable name="col8">CSV00008</xsl:variable>
<xsl:variable name="col9">CSV00009</xsl:variable>

JS文件

// Extract title and column nodes
var varNodes = $(csvXsl).find("xsl\\:variable");

我尝试引用本文的想法, 在CSS选择器中处理元素ID中的冒号 ,但这是针对CSS的。 但我确实尝试用\\\\3A\\\\3a3a3A替换\\:没有这些工作。

有什么建议么?

根据要求,这里有关于如何创建XSL对象的更多信息。

function loadXml(xmlFilePath) {
    var retObj = null ;
    var timeUniq = (new Date()).getTime();

    // check protocol
    var protocol = document.location.protocol;
    if(protocol.toLowerCase().indexOf("http")>=0){
        $.ajax({
            url: xmlFilePath + "?t=" + timeUniq,
            type: 'get',
            dataType: 'xml',
            async: false,
            timeout: 1000
        })
           .done(
               function(xml, status){
                   if( status != 'success' ){
                       return;
                   }
                   retObj = xml;
               })
           .fail(
               function(xhr, textStatus){
                   return;
               });
    }

    return retObj;
}

csvXsl = loadXml("./xsl/OrderListCSV.xsl");

谢谢。

更新

根据要求,我添加了一个小提琴。

http://jsfiddle.net/Q3jNN/

UPDATE2

使用JSFiddle例程,所有功能都归功于评论员Niet。

http://jsfiddle.net/dNDN6/2/

如果链接断开,这里是相关部分:

// Workaround for JQuery bug, primarily using Vanilla JS.

function serializeXmlNode(xmlNode) {
    if (typeof window.XMLSerializer != "undefined") {
        return (new window.XMLSerializer()).serializeToString(xmlNode);
    } else if (typeof xmlNode.xml != "undefined") {
        return xmlNode.xml;
    }
    return "";
}

var tmpStr = serializeXmlNode(csvXsl); // Converts XML/XSL object to String
var tmp = document.createElement('div');

tmp.innerHTML = csvXsl; // Does not work
tmp.innerHTML = tmpStr; // This one works, had to serialize object first

var varNodes = tmp.getElementsByTagName('xsl\:variable'); // Works
var varNodes2 = tmp.getElementsByTagName('xsl:variable'); // Also works

我会做很多步骤来调试这个问题:

  1. 检查csvXls变量的内容,你可以尝试例如查找: console.log(csvXsl)然后$(csvXsl).find("xsl\\\\:variable"); $("xsl\\\\:variable",csvXsl);

  2. 如果该变量包含正确的节点,例如<xsl:variable name="col9">CSV00009</xsl:variable>那么它可能是jQuery中的一个错误,我觉得要在这样的基本选择器中排除。

  3. 发布如何获得更多上下文的csvXsl ,以便我们更好地帮助您。

这确实是jQuery中的一个错误。

尝试使用Vanilla JS代替:

var tmp = document.createElement('div');
tmp.innerHTML = csvXsl;
var varNodes = tmp.getElementsByTagName('xsl:variable');

必须通过'回答'评论,因为没有足够的代表

这条线:

 var inputTag = $("#test\\:1").val()); 

在小提琴据说显示什么有效: http//jsfiddle.net/dNDN6/2/

实际上在Chrome / webkit中不起作用

正确的方法是首先在没有命名空间(冒号后)的标签上使用普通JS和getElementsByTagName,如果没有元素,则使用完整标签,如下所示:

var x = xmlDoc.getElementsByTagName("variable");
if (!x[0]) x = xmlDoc.getElementsByTagName('xsl:variable');

x将包含你的数组[跨浏览器]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM