2010-11-19 10 views
29

Wykonuję asynchroniczne żądania HTTP (Ajax) za pośrednictwem jQuery z podstawowym $ .ajax(). Kod wygląda następująco:Znak Ampersand (&) wewnątrz wartości opcji danych żądań jQuery AJAX

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + thisId + "&value=" + thisValue, 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 

}); 

Wszystko działa prawidłowo, jak zwykle, aż użytkownik wpisze wewnątrz textarea ampersand (&) charakteru. Niż podczas debugowania funkcji PHP, która zapisuje wartość, zawsze ma wartość do tego znaku.

Wierzę, że musi istnieć rozwiązanie, aby w jakiś sposób pominąć znak ampersand (&). Jakieś pomysły?

Odpowiedz

81

Zamiast:

data: "id=" + thisId + "&value=" + thisValue 

zrobić:

data: { id: thisId, value: thisValue } 

ten sposób jQuery zajmie prawidłowo URL kodowania wartości. powiązań, String są źródłem wszelkiego zła :-)

+5

+1 Może nie * wszystkie *, ale dużo. :-) –

+0

ale czy będę w stanie uzyskać wartości w pliku PHP za pomocą prostego $ _POST []? To samo, co przekazywanie wartości w ciągu, prawda ?! –

+0

@Nikita, yeap, zupełnie w ten sam sposób. Różnica polega na tym, że będą odpowiednio zakodowane. –

6

wystarczy użyć funkcji javascript encodeURIComponent():

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + thisId + "&value=" + encodeURIComponent(thisValue), 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 

}); 
+0

Nigdy nie jest za późno, aby ktoś ci zeznawał: D – mkey

26

Zalecamy używać solution provided by Darin powyżej, jeżeli w ogóle jest to możliwe; w ten sposób ponownie wykorzystasz sprawdzony kod do budowania danych POST.

Ale jeśli naprawdę, naprawdę, naprawdę trzeba używać konkatenacji ciągów (tu lub gdzie indziej w aplikacji podczas budowania ciągów zapytań lub POST dane Spośród wejść przez użytkownika), trzeba użyć encodeURIComponent:

$("textarea").blur(function(){ 
    var thisId = $(this).attr("id"); 
    var thisValue = $(this).val(); 

    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: "id=" + encodeURIComponent(thisId) + "&value=" + encodeURIComponent(thisValue), 
     success: function(){ 
     alert("Saved successfully!"); 
     } 
    }); 
}); 

Domyślnie podczas wysyłania POST z jQuery.ajax, wysyłasz dane o typie treści application/x-www-form-urlencoded, co oznacza, że ​​obiecujesz, że dane są zakodowane w ten sposób. Musisz być pewien, że zachowasz swoją część umowy i faktycznie ją zakodować. Nie jest to ważne tylko dla amperand.

+0

+1 za wyjaśnienie _dlaczego_ wystąpił błąd i jak go naprawić. – sholsinger

+0

Tak naprawdę to wypróbowałem i to nie zadziałało. Próbowałem też zastąpić '&' '&' i to nic nie pomogło, o dziwo. –

+1

@EduardLuca: * "Tak naprawdę to wypróbowałem i to nie zadziałało." * Musisz podać kilka szczegółów (prawdopodobnie w twoim własnym pytaniu); 'encodeURIComponent' ** jest ** poprawnym sposobem na zrobienie tego.* "Próbowałem również zastąpić & & i nic to nie dało, zadziwiająco" * Właściwie to nie dziwi, ponieważ jest to kodowanie encji HTML, które nie ma nic wspólnego z kodowaniem URI. –

0
$.ajax({ 

    type:'POST', 
dataType: "text", 
    url:'save.php', 
    data:'_id='+$('#id').val()+'&title='+$('#title').val(), 
?? 
data: { id: thisId, value: thisValue } 
+0

Czy to jest rozwiązanie, które oferujesz? –

Powiązane problemy