javascript 函数仅适用于 firefox

Posted

技术标签:

【中文标题】javascript 函数仅适用于 firefox【英文标题】:javascript function works only on firefox 【发布时间】:2022-01-21 08:56:07 【问题描述】:

我制作了一个功能,可以在单击按钮后显示卡片图像。问题是它不适用于chrome。 chrome 编辑器会在路径末尾显示一个额外的“/”。

        function renderDeck(deck,ph)
    
        
        var htmlStr = document.getElementById(ph).innerHTML;
        for (var i = 0; i < deck.length; i++) 
            htmlStr += '<div>';
            htmlStr += '<img src=' + deck[i].path + '/>';
            htmlStr += '</div>';
        
        document.getElementById(ph).innerHTML = htmlStr;
    

一个我推入甲板的例子

deck.push( name: 'red_joker', path: 'cardImages/red_joker.png', val: 15 );

可能是什么问题?

【问题讨论】:

试试htmlStr += '&lt;img src="' + deck[i].path + '"/&gt;'; 您已经用 html 标签标记了问题,HTML 不包含自闭合标签,尽管浏览器可以容忍它们。此外,您始终应该引用属性值,不这样做会带来安全风险(在这种特殊情况下可能不会,但越早忘记不良做法越好)。 【参考方案1】:

题外话:避免innerHTML += ...,因为

它必须序列化然后解析所有现有的 dom 节点 它将所有现有节点替换为副本/新节点,因此事件处理程序、您保留的引用等内容都将消失。 标记本身未表达的所有内容。
function renderDeck(deck, ph) 
  // create the markup for the new items 
  const htmlStr = deck.map(item => `<div><img src="$item.path"></div>`).join("\n");

  // parse the `htmlStr` into a DOM Node that you can add to other DOM Nodes. 
  const fragment = document.createRange().createContextualFragment(htmlStr);

  // append the DocumentFragment to the existing element.
  document.getElementById(ph).append(fragment);

还有一个链接供那些还不知道DocumentFragment 是什么的人使用。

【讨论】:

尽管如此,这确实是题外话,OP 从未写过innerHTML +=,他们将innerHTML 检索到字符串中,向该字符串添加更多内容,然后将其重新分配给元素。跨度> @Teemu 这只是表面上的区别。就像return stuff;var result = stuff; return result; 之间的区别一样。你能告诉我这两个代码之间的行为有什么区别吗?特别是关于我上面提到的问题。好的,内存分配会略有不同,但这远远超出了 OP 的问题和我的回答。 如果 OP 会在循环中完成element.innerHTML += ...,我会很好地理解答案。但是 OP 并没有保留#ph 中的现有 HTML,元素内容被覆盖(如果有内容,问题就不说了)。但我同意你的看法,对现有元素设置 innerHTML 的唯一合法用途是清空元素。

以上是关于javascript 函数仅适用于 firefox的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 函数仅适用于 Windows 机器

Javascript函数仅适用于表格的第一行[重复]

css 仅适用于Firefox的CSS

Google HTML 5 Geolocation“使用我的位置”仅适用于 Firefox

输入范围 - 高度0仅适用于firefox

使用 JavaScript 裁剪图像适用于 IE,但不适用于 Firefox [重复]