jQuery适用于Firefox,但不适用于IE

时间:2011-07-12 17:26:40

标签: javascript jquery

好的男生/女生。

下面是一些在Firefox中运行但没有IE的jQuery。我不知道为什么它会在一个而不是另一个中出现。

任何??

function SwapTextAssetforPOS() {

    $("*").each(function () {

        if ($(this).children().length == 0) {

            $(this).text($(this).text().replace('Assets', 'POS'));
            $(this).text($(this).text().replace('Asset', 'POS'));
            $(this).text($(this).text().replace('assets', 'POS'));
            $(this).text($(this).text().replace('asset', 'POS'));

        }

    });

}

对不起朋友 - 我得到的错误是: -

SCRIPT65535:意外调用方法或属性访问。 jquery-1.6.min.js,第16行60352

修改:------------------------------------------ ------------------------------------------

好的,所以更新 - 我删除了*选择器,IE不再爆炸,我现在的问题是我不知道如何让它在元素上进行替换。我有以下代码来ping对象中的所有文本元素:

function SwapTextAssetforPOS() {
        var containerElementByID = $("#assetDetailContents");

        containerElementByID.children().children().each(function () {
            var $this = $(this);

            alert($this.text());


        });

这让我对每一段文字都发出警告,但有些文字包含在一张桌子里,有些是在一个范围内,有些是在那里。我无法控制大部分这些东西,所以我的新问题是如何使用这种类型的选择器使之前的替换工作。 - 我可以相信这是多么痛苦..

再次干杯

5 个答案:

答案 0 :(得分:3)

我在IE浏览器中看到了问题。当你执行$("*").each时......它会占用页面中的每个元素(包括标题,脚本等)。当你执行.text()时,看起来IE中的某些元素失败了.text()没有意义。将“*”替换为“div”,例如它应该适用于div。
也许你可以做一些像if ($(this).text()) {$(this).text($(this).text().replace('Assets', 'POS'));}这样的事情来确保为该元素定义text()。

尽管如此,通过整个DOM是有点过分的。你可以在可以包含文本的元素中添加一个类吗?比如class="replaceable",这样你就可以做$(".replaceable").text(...

答案 1 :(得分:1)

好的人 - 首先感谢你的帮助。

我通过拼凑一些建议并做了一些调查工作来解决这个问题。

简而言之,当IE遇到标签时,它正在走出去。我不是没有原因,但这是它每次都落空的地方。

function SwapTextAssetforPOS() {

        var overlaycon = $("#jq-selectionHelper").find("*:not(img)"); //This line simply looks at the div surrounding the template and returns (to an array I believe) every element therein except for img tag
                                                                      //as this breaks in IE when tying to do the replace text stuff below. 

        overlaycon.each(function () {

            var $this = $(this);

            if ($this.children().length == 0) {
                $this.text($(this).text().replace('Assets', 'POS'));
                $this.text($(this).text().replace('Asset', 'POS'));
                $this.text($(this).text().replace('assets', 'POS'));
                $this.text($(this).text().replace('asset', 'POS'));
            }
        });
    }

此代码运行,我相信它比我原来的产品更有效。任何有关表现重新分解的进一步建议都是受欢迎的,但感谢上帝现在的工作。

再次感谢您的帮助。

此致

答案 2 :(得分:0)

此代码没有问题。我在IE和FF测试都工作正常

http://jsfiddle.net/wKWRC/

你应该使用F12开发者工具进行IE浏览,看看你得到了什么错误,其他人可以知道究竟是什么问题。您可以调试脚本并查看出错的位置。 IE对javascript错误很敏感,并且在调用此函数之前可能存在一些错误。

http://msdn.microsoft.com/en-us/library/gg699336%28v=vs.85%29.aspx

答案 3 :(得分:0)

只是预感但你可能在IE中耗尽内存。

首先,使用$('*')永远不可取,最好使用$('p')这样的选择器缩小范围。

此外,每次调用$(this)时都会创建一个新的jQuery对象,所以如果页面上有很多元素,那么每次都会生成9个对象。

惯例是在函数开头设置$this = $(this),这样你只能使用一个对象。

function SwapTextAssetforPOS() {

    $("*").each(function () {

        var $this = $(this);

        if ($this.children().length == 0) {

            $this.text($this.text().replace('Assets', 'POS'));
            $this.text($this.text().replace('Asset', 'POS'));
            $this.text($this.text().replace('assets', 'POS'));
            $this.text($this.text().replace('asset', 'POS'));

        }

    });

}

答案 4 :(得分:0)

尝试这样

for (var i = 0, replacements = ['Assets','assets','asset','Asset']; i < 4; i++)
    $("*:contains('" + replacements[i] +"')").map(function() { this.innerHTML = this.innerHTML.replace(/asset(s){0,1}/igm, 'POS'); })