特殊字符打破HTML字符串

时间:2017-10-06 14:40:03

标签: jquery html dom special-characters

我正在使用jQuery从输入文本字段中删除不需要的html标记。这很好,但是,当一个特殊字符作为html实体输入时,例如™(我想允许)我在创建DOM时会出现以下错误:

  

语法错误,无法识别的表达式:... ™

我们的想法是从文本字段中获取html字符串;从中创建一个DOM元素;然后,只删除不需要的标签。

数据如:<span>My <b>company</b></span>被清理为My <b>company</b> ...我期待。

但输入的数据如:My <b>company</b> &trade;中断

&#13;
&#13;
var s = jQuery(this).find('#new-topic').val();
var $s = jQuery(s); //this is where the error occurs
var $elements = $s.find("*").not("b, strong"); //get elements that are not <b> or <strong>

for (var i = $elements.length - 1; i >= 0; i--) {
  var e = $elements[i];
  jQuery(e).replaceWith(e.innerHTML);
}

var finalInput = $s.html();
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="new-topic" type="text">
&#13;
&#13;
&#13;

在这种情况下,是否允许使用特殊字符?

1 个答案:

答案 0 :(得分:0)

当从文本字段捕获的字符串未包含在标记中时,实际上会引起该问题;例如://exception here //Uncaught TypeError: Cannot read property 'on' of undefined me.items[0].on('select', onSiRemoteCombo, this); 但是My <b>company</b> &trade;确实有效。如果没有在文本字段中输入标签,这也会产生一些不良行为:<span>My <b>company</b> &trade;</span>。为了解决这个问题,我在创建DOM元素之前总是将字符串包装在标记中:My company

&#13;
&#13;
s = '<test>'+s+'</test>';
&#13;
jQuery('#remove-unwanted-tags').on('click', function() {
    var s = jQuery('#new-topic').val();
    console.log('Before removing unwanted tags: ' + s);
    s = '<test>' + s + '</test>'; //added fix
    var $s = jQuery(s); //this is where the error occurs
    var $elements = $s.find("*").not("b, strong"); //get elements that are not <b> or <strong>
    
    for (var i = $elements.length - 1; i >= 0; i--) {
        var e = $elements[i];
        jQuery(e).replaceWith(e.innerHTML);
    }
    
    var finalInput = $s.html();
    console.log('After removing unwanted tags: ' + finalInput);
});
&#13;
&#13;
&#13;

不确定这是否是清除不需要的标签的最佳方法,但至少它是有效的。