簡體   English   中英

在javascript中轉義撇號

[英]Escaping apostrophes in javascript

我的自動填充搜索字段有問題。 這一切都很有效,直到在搜索中使用撇號。 現在,var名稱和相應的數據庫名稱都有空格而不是撇號,以便這些名稱起作用。

我知道我需要逃避撇號(\\')並在var列表中嘗試過這個但是它不起作用,因為我猜它需要在javascript代碼中清理(因為它)但我不知道如何或在哪里。

代碼如下(對不起,這么多),任何幫助將不勝感激:

 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"> 

在var properties我已經更改了一個名稱( "Bouton d'Or" ),當我在搜索字段中鍵入b時,正如預期的那樣,它創建了一個以B開頭的名稱列表,但是當我從自動完成列表中選擇帶有撇號的名稱,如Bouton d'Or ,它在搜索字段中放置的值是"Bouton d"它在撇號處停止。

即使我將var名稱更改為"Bouton d\\'Or" ,它仍然"Bouton d\\'Or" ,這就是為什么我認為應該在該行插入一些特定的代碼:

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

但我不確定。

我真的希望這是有道理的。

你的問題是在HTML方面逃避而不是在JavaScript中。

"<input type='hidden' value='" + arr[i] + "'>"變為:

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

或者與你的\\逃脫它變成:

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

但在這兩種情況下,屬性的值將結束在'在之前Or ,因為\\不用於在HTML中逃脫。

正確轉義' in html是&#x27;

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

然后生成的html將是:

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

我可以在JavaScript中轉義html特殊字符嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM