2012-03-19 11 views
19

Debuguję ten ajax od dłuższego czasu. Mam to w moim pliku jQuery:json_encode nie działa z łańcuchem html jako wartością

$("#typeForm").ajaxForm({ 
    success : function(html){ 
     alert(html); 
}).submit(); 

Wymaga service.php, aw nim mam to:

$data = array('upload_data' => $this->upload->data()); 
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>"; 
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str)); 

To nie zadziała. Ale zastępując $str do $str = "HELLO WORLD"; jQuery ostrzega, co powinienem oczekiwać. Co wydaje się być problemem?

EDIT:

Oto screenie wyjścia:

enter image description here

Czyni alarmy, ale jeśli mogę zmodyfikować moje jQuery w tym:

$("#typeForm").ajaxForm({ 
    success : function(html){ 
     var obj = $.parseJSON(html); 
     alert(obj); 
}).submit(); 

wtedy robi w ogóle nic, nawet ostrzegając.

Zrobiłem var_dump na json_encode I tu jest wysypisko, to wygląda jak zniekształconego JSON:

string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!&lt;\/span&gt;&lt;\/div&gt;"}" 
</span></div> 

Oto pełna treść service.php

class Service extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
    public function index() 
    { 
     $filename = 'uploadfile'; 

     $config['upload_path'] = './uploads/temp'; 
     $config['allowed_types'] = 'jpg|png|gif|doc|docx|pdf|ppt|pptx|xls|xlsx|bmp'; 
     $config['max_size'] = '3072'; 
     $config['encrypt_name'] = TRUE; 
     $config['remove_spaces'] = TRUE; 

     $this->load->library('upload', $config); 

     if (!$this->upload->do_upload($filename)) 
     { 
      $error = array('error' => $this->upload->display_errors()); 
        echo json_encode(array('error' => $error['error'])); 
     } 
     else 
     { 
      $data = array('upload_data' => $this->upload->data()); 
      $file_name = $data['upload_data']['file_name']; 
      //print_r($data); 
      //echo json_encode(array('test' => "Hello World")); 
      $str = "<div style='position:relative;'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>"; 
      $str2 = json_encode(array("file_name" => $file_name, "prompt" => $str)); 
      //var_dump($str2); 
      exit(json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str))); 
     } 
    } 
} 
+0

Twój JSON wygląda .. .? –

+0

"nie zadziała", masz na myśli to, że wyrzuca błędy? Lub nie wstrzykuje HTML lub ..? –

+0

Jak to "nie działa"? JSON nie może się tym przejmować CO umieścisz w łańcuchu - może to być liczba, może to być tekst, może to być html. to nie ma znaczenia, o ile zasady składni JSON są honorowane. –

Odpowiedz

0

It wygląda na to, że musisz uciec od notowań po stronie serwera. Ponieważ są tam, wydaje się, że tworzą nieprawidłowy ciąg JSON.

+0

Właśnie podejrzewam, ale nie mogę znaleźć odpowiedniego ucieczki w '$ str' –

+0

jeśli chcesz ręcznie uciec przed tym, możesz zmienić to na $ str = "

Nachricht empfangen!
"; – davehale23

3

Niektóre rzeczy spróbować:

ajaxForm wspiera argumentu typu danych, jeśli można się spodziewać JSON pochodzących z serwera, użyj dataType: json jak tak

$("#typeForm").ajaxForm({ 
    success : function(html){ 
     // html here is already automatically a json object 
     alert(html.prompt); 
    }, 
    dataType: 'json' 
}).submit(); 

mógłbyś zamieścić pełną service.php? Lub to następujące:

wyjście (json_encode (tablica ('nazwą_pliku' => $ danych [ 'upload_data'] [ 'nazwa_pliku_logu'] 'szybka' => $ ul)));

- EDIT -

Nie wiem, dlaczego json_encode powraca takie dziwne smyczkowych: s, jest json_encode standardowe biblioteki php lub zewnętrznej biblioteki? Pytam, bo to niektóre serwery nie mają json_encode w ich instalacji php ... testowałem na moim lokalnym i przy użyciu wewnętrznego json_encode PHP i to działa dobrze:

<?php 
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>"; 
echo json_encode(array('prompt' => $str)); 

// output 
//{"prompt":"<div style='position:relative'><img src='\/assets\/ui\/success.png' \/><span style='position:relative;top:-15px;'>Nachricht empfangen!<\/span><\/div>"} 
+0

Dzięki za to, ale nie, to nie działa. Jeśli to zrobię, to w ogóle się nie ostrzeże. –

+0

Czy masz stronę testową na ten temat? Łatwiej, gdybym mógł przejść i przetestować bezpośrednio –

+0

i tak, nie będzie ostrzeżenia, ponieważ json typu dataType oczekuje prawidłowego łańcucha json, w którym to przypadku "HELLO WORLD" nie jest prawidłowym jsonem –

0
string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!&lt;\/span&gt;&lt;\/div&gt;"}" 
</span></div> 

To wydaje się być uszkodzony ponieważ nie ma ucieczki cudzysłów. Kiedy zostanie znalezione "bez zmiany", łamie strukturę JSON, której oczekujesz. Zbiegiem znaków "powinno być \", pojedyncze cudzysłowy z \ 'i tak dalej.

0

Jeśli nie można znaleźć lepszego rozwiązania tego można zakodować wartość kodowania base64:

$data = array('upload_data' => $this->upload->data()); 
$str = base64_encode("<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>"); 
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str)); 

a klientem dekodować go, IMO jest to bardziej bezpieczniej jest również bardziej zastosowanie, jeśli jesteś przetwarzanie znaków z różnych języków.

TAKŻE:

aby upewnić się, że żadne inne znaki zostaną dodane na wezwanie json ciąg wyjścia; pisarz po wydrukowaniu.

+0

Ten rodzaj pracy, ale jak by to dekodować w jQuery? –

+0

dla chrome lub mozilla możesz użyć atob() lub btoa() – jerjer

+0

dla innych przeglądarek u możesz użyć tej biblioteki js http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html lub ten http://stackoverflow.com/questions/246801/how-can-you-encode-to-base64-using-javascript – jerjer

66

Miałem ten sam problem z json_encode dzisiaj. Ale po przetestowaniu dużo znalazłem właściwe rozwiązanie:

w PHP do kodowania tablicy lub ciąg:

PHP: json_encode(ARRAY, JSON_HEX_QUOT | JSON_HEX_TAG); 

w JavaScript zdekodować sam:

JS: var d = $.parseJSON(content); 
+3

Niesamowita odpowiedź! To jest sposób na zrobienie tego. –

+0

Miałem ten sam problem, ale miałem już prawie rozwiązanie. Używałem 'json_encode ($ json, JSON_HEX_QUOT | JSON_HEX_APOS)'. Zmiana 'JSON_HEX_APOS' na' JSON_HEX_TAG' spowodowała, że ​​moje problemy zniknęły! – RedYetiCo

+2

To powinno być oznaczone jako poprawna odpowiedź. – Robert

Powiązane problemy