【问题标题】:Having trouble passing an apostrophe or double quote through a clickable link通过可点击链接传递撇号或双引号时遇到问题
【发布时间】:2018-12-29 23:12:35
【问题描述】:

我有一些接收字符串的代码(其中可能有撇号或双引号)。收到字符串后,将创建一个链接以允许用户在输入中使用该字符串。

我创建了一个模型 jsfiddle here 以简化方式演示问题。在现实世界的版本中,它要复杂得多,并且不存在第一个输入和使用按钮 - 它们只是在小提琴中模拟接收到的字符串。

要对其进行测试,请在“带撇号的字符串”输入中输入一些带撇号的文本,然后单击“使用”按钮。它会在“复制的字符串”之后创建一个链接,上面写着“使用文件名”。如果单击该链接,它应该将字符串放入第二个输入中。如果没有撇号也没关系,但撇号不起作用(您可以在控制台中看到错误:SyntaxError: "" string literal contains an unescaped line break)。

如果我重写$("#usespan").html() 行并将所有" 切换为',则撇号有效,但双引号无效。

我怎样才能让它同时适用于" 和'?

谢谢!

Jsfiddle 代码 (HTML):

<p>String with apostrophe : <input id="fn"> <input type="button" value="Use" id="usefn"></p>

<p>Copied String: <span id="usespan"></span><br><br><input id="final">

Jsfiddle 代码(JS):

$("#usefn").on("click", function() {
    var fn = $("#fn").val();
    fn = myHtmlEntities(fn);
    $("#usespan").html(' <a href="javascript:void(0)" onclick="$(\'#final\').val(\' '+fn+'\');">Use Filename</a>');
});

function myHtmlEntities(str) {
   return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g,'&apos;');
}

【问题讨论】:

    标签: javascript jquery html css webpage


    【解决方案1】:

    也许最好的解决方案是在收到输入后替换\' 的单引号。因此,您将添加.replace(/'/g, '\'') 到

    function myHtmlEntities(str) {
       return String(str).replace(/'/g, '\'').....
    }
    

    How to Work with Strings in JavaScript: \' 的语法总是单引号...

    【讨论】:

    • 有趣。我想更好地理解为什么造成麻烦,我认为使用特殊字符的 & 版本总是前进的方向。谢谢!
    • 我认为这是因为,当您转义字符时,它清楚地将其与撇号的其他用途分开。
    【解决方案2】:

    您可以使用第三种表示字符串的方式 - 反引号 (`)。这也将允许您使用 template literals 而不是当前的字符串连接:

    $("#usespan").html(`<a href="javascript:void(0)" onclick="$('#final').val(${fn});">Use Filename</a>`);
    

    注意:这在 Internet Explorer 中不起作用。如需浏览器支持的完整列表,请参阅CanIUse page。

    【讨论】:

    • 不幸的是我必须支持 IE :(
    【解决方案3】:

    我似乎无法在 IE11 中打破这一点。要么这样,要么我完全误解了你!

            "use strict";
            function byId(id){return document.getElementById(id)}
            function newEl(tag){return document.createElement(tag)}
            window.addEventListener('load', onWindowLoaded, false);
    
            function onWindowLoaded(evt)
            {
                byId('myInput').value = "\`whats wrong with this?\"!";
                byId('goBtn').addEventListener('click', onGoClicked, false);
            }
    
            function onGoClicked(evt)
            {
                byId('output1').innerHTML = '';
                var a = newEl('a');
    //            a.innerHTML = "Use Filename";
                a.innerHTML = byId('myInput').value;
                a.href = "javascript:void(0)";
                a.setAttribute('data-text', byId('myInput').value);
                a.addEventListener('click', function(){byId('output2').value=this.getAttribute('data-text');}, false);
                byId('output1').appendChild(a);
            }
    String with apostrophe: <input id='myInput'/><button id='goBtn'>Use</button><br>
    Copied String: <span id='output1'></span><br>
    <input disabled id='output2'/>

    【讨论】:

    • 我对这个答案感到困惑。你几乎完全重写了 OP 的代码。这并没有回答如何让他​​们的代码正常工作的问题......
    • @HereticMonkey - 简单地说,有问题的文本字符串被分配给链接的新创建属性。单击链接时,将根据需要提取和应用文本。我的代码旨在演示单引号、双引号和感叹号,以显示字符串替换体操的明显无关的使用。你得到它,你拿着它,你爆炸它。 OPs 问题表明不需要杂技,因此,我没有展示它们。也许问题是(也是?!)缺乏......
    • 我不确定 IE11 在哪里出现,除了对@Jack Bashford 的问题的回应,这是关于他们的解决方案,模板文字在 IE 中不起作用。我在您的回复中没有看到模板文字,所以我并不惊讶它在 IE 中工作。此外,在现实世界中,我原来的问题中的 js 是由 ajax 加载的,并且在主页上添加侦听器时存在其他(代码所有权)问题,我不会在这里讨论,所以我一直在寻找内联解决方案就像我拥有的​​一样。不过还是感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 2020-03-09
    • 1970-01-01
    • 2015-12-22
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多