简体   繁体   English

在javascript中转义撇号

[英]Escaping apostrophes in javascript

I have a problem with an autocomplete search field. 我的自动填充搜索字段有问题。 It all works well until an apostrophe is used in the search. 这一切都很有效,直到在搜索中使用撇号。 For now both the var names and the corresponding database names have spaces instead of apostrophes so that these names work. 现在,var名称和相应的数据库名称都有空格而不是撇号,以便这些名称起作用。

I know I need to escape the apostrophe (\\') and have tried this in the var list but it doesn't work because I'm guessing it needs to be cleaned (as it were) in the javascript code but I don't know how or where. 我知道我需要逃避撇号(\\')并在var列表中尝试过这个但是它不起作用,因为我猜它需要在javascript代码中清理(因为它)但我不知道如何或在哪里。

The code is below (sorry it's so much) and any help would be greatly appreciated: 代码如下(对不起,这么多),任何帮助将不胜感激:

 function autocomplete(inp, arr) { /*the autocomplete function takes two arguments, the text field element and an array of possible autocompleted values:*/ var currentFocus; /*execute a function when someone writes in the text field:*/ inp.addEventListener("input", function(e) { var a, b, i, val = this.value; /*close any already open lists of autocompleted values*/ closeAllLists(); if (!val) { return false;} currentFocus = -1; /*create a DIV element that will contain the items (values):*/ a = document.createElement("DIV"); a.setAttribute("id", this.id + "autocomplete-list"); a.setAttribute("class", "autocomplete-items"); /*append the DIV element as a child of the autocomplete container:*/ this.parentNode.appendChild(a); /*for each item in the array...*/ for (i = 0; i < arr.length; i++) { /*check if the item starts with the same letters as the text field value:*/ if (arr[i].substr(0, val.length).toUpperCase() === val.toUpperCase()) { /*create a DIV element for each matching element:*/ b = document.createElement("DIV"); /*make the matching letters bold:*/ b.innerHTML = "<strong>" + arr[i].substr(0, val.length) + "</strong>"; b.innerHTML += arr[i].substr(val.length); /*insert a input field that will hold the current array item's value:*/ b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>"; /*execute a function when someone clicks on the item value (DIV element):*/ b.addEventListener("click", function(e) { /*insert the value for the autocomplete text field:*/ inp.value = this.getElementsByTagName("input")[0].value; /*close the list of autocompleted values, (or any other open lists of autocompleted values:*/ closeAllLists(); }); a.appendChild(b); } } }); /*execute a function presses a key on the keyboard:*/ inp.addEventListener("keydown", function(e) { var x = document.getElementById(this.id + "autocomplete-list"); if (x) x = x.getElementsByTagName("div"); if (e.keyCode == 40) { /*If the arrow DOWN key is pressed, increase the currentFocus variable:*/ currentFocus++; /*and and make the current item more visible:*/ addActive(x); } else if (e.keyCode == 38) { //up /*If the arrow UP key is pressed, decrease the currentFocus variable:*/ currentFocus--; /*and and make the current item more visible:*/ addActive(x); } else if (e.keyCode == 13) { /*If the ENTER key is pressed, prevent the form from being submitted,*/ e.preventDefault(); if (currentFocus > -1) { /*and simulate a click on the "active" item:*/ if (x) x[currentFocus].click(); } } }); function addActive(x) { /*a function to classify an item as "active":*/ if (!x) return false; /*start by removing the "active" class on all items:*/ removeActive(x); if (currentFocus >= x.length) currentFocus = 0; if (currentFocus < 0) currentFocus = (x.length - 1); /*add class "autocomplete-active":*/ x[currentFocus].classList.add("autocomplete-active"); } function removeActive(x) { /*a function to remove the "active" class from all autocomplete items:*/ for (var i = 0; i < x.length; i++) { x[i].classList.remove("autocomplete-active"); } } function closeAllLists(elmnt) { /*close all autocomplete lists in the document, except the one passed as an argument:*/ var x = document.getElementsByClassName("autocomplete-items"); for (var i = 0; i < x.length; i++) { if (elmnt != x[i] && elmnt != inp) { x[i].parentNode.removeChild(x[i]); } } } /*execute a function when someone clicks in the document:*/ document.addEventListener("click", function (e) { closeAllLists(e.target); }); } /*An array containing all the property names:*/ var properties = ["Aigue Marine 10","Aigue Marine 9","Alizés","Amirauté","Arc En Ciel II 295","Belle du Marais","Bien Etre","Bleuets","Bouton d'Or","Bruyeres","Calumet","Cigales 15","Clé des Pins","Clémenceau ","Coquelicot"]; /*initiate the autocomplete function on the "propertynames" element, and pass along the properties array as possible autocomplete values:*/ autocomplete(document.getElementById("propertynames"), properties); 
 <input id="propertynames"> 

In var properties I have changed one name as I would like it to be ( "Bouton d'Or" ) and when I type b into the search field it, as expected, creates a list of names beginning with B as expected but when I choose a name with an apostrophe from the autocomplete list like Bouton d'Or , the value it places in the search field is "Bouton d" it stops at the apostrophe. 在var properties我已经更改了一个名称( "Bouton d'Or" ),当我在搜索字段中键入b时,正如预期的那样,它创建了一个以B开头的名称列表,但是当我从自动完成列表中选择带有撇号的名称,如Bouton d'Or ,它在搜索字段中放置的值是"Bouton d"它在撇号处停止。

It still does this even if I change the var name to "Bouton d\\'Or" so that's why maybe I think there should be some specific code inserted at the line: 即使我将var名称更改为"Bouton d\\'Or" ,它仍然"Bouton d\\'Or" ,这就是为什么我认为应该在该行插入一些特定的代码:

b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";

but I'm not sure. 但我不确定。

I really hope this makes sense. 我真的希望这是有道理的。

Your problem is the escaping on the html side and not in JavaScript. 你的问题是在HTML方面逃避而不是在JavaScript中。

The "<input type='hidden' value='" + arr[i] + "'>" becomes: "<input type='hidden' value='" + arr[i] + "'>"变为:

<input type='hidden' value='Bouton d'Or'>

Or with your \\ escaping it becomes: 或者与你的\\逃脱它变成:

<input type='hidden' value='Bouton d\'Or'>

But in both cases the value of the attribute will end at the ' before the Or , because the \\ is not used for escaping in html. 但在这两种情况下,属性的值将结束在'在之前Or ,因为\\不用于在HTML中逃脱。

The proper escaping of ' in html is &#x27; 正确转义' in html是&#x27; .

 "<input type='hidden' value='" + arr[i].replace(/'/g,'&#x27;') + "'>"

And the resulting html will then be: 然后生成的html将是:

<input type='hidden' value='Bouton d&#x27;Or'>

Can I escape html special chars in javascript? 我可以在JavaScript中转义html特殊字符吗?

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

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