2011-06-13 46 views
2

我試圖使用PHP的ヶ輛脫身傳遞複雜變量javascript和這裏的地方我停了下來:有道通過HTML

<?php 
echo '<img ... onclick="MP.view(\''.$i->name.'\') />'; 
?> 

但轉念一想,而不是做替換並檢查特殊字符,我只會JSON整個對象。

<?php 
echo '<img ... onclick="MP.view('.json_encode($i).') />'; 
?> 

而這提供了一個非常不希望的結果,導致大量的雙引號。 那麼我該怎麼做?我應該爲每個圖像分配一個數字唯一的ID並傳遞id,然後從JS數組中查找其餘數據?

+0

爲什麼不只需傳遞圖片的網址即可查看?這將有助於瞭解'MP.view'的功能... – 2011-06-13 19:27:43

+0

假設MP.view在圖像的URL扮演的角色較小的情況下執行了一些相當複雜的操作。基本上我需要傳遞大量的數據 – Mikhail 2011-06-13 20:05:07

回答

6

在這種情況下,正確的做法是:

htmlspecialchars(json_encode($var), ENT_QUOTES, "UTF-8") 

htmlspecialchars將任何雙引號到合適的HTML逃逸,使其適用於大多數屬性生成的字符串。 ENT_QUOTES參數也照顧單引號;但你可能不需要你的例子。

+0

然後接收函數會收到一個字符串,不是嗎? – Mikhail 2011-06-13 20:04:11

+0

Ehm,no。轉義僅僅是爲了HTML屬性的有效性。所以雙引號不會與DOM結構衝突。但是你放在那裏的JSON表達式仍然可以是一個對象。瀏覽器注意在那裏傳遞原始JSON /對象的回調函數。 – mario 2011-06-13 20:06:30

+0

完美。這使我可以在傳遞的對象中添加額外的信息,這樣函數就可以只接收一個參數而逃脫 – Mikhail 2011-06-13 20:57:14

0

它將採取了一大堆少逃逸(和更少的字節)來傳遞數據是這樣的:

echo '<script>var myObj = '.json_encode($i).'</script>'; 

然後,你的代碼可能看起來更像是這樣的:

echo '<img ... onclick="MP.view(myObj)" />'; 
+0

仍然可能最好使用htmlspecialchars在這種情況下,對嗎? – 2011-06-13 19:37:58

+0

@Frank:我從來不需要它。不過,您可能希望將其包裝在CDATA標籤中。 – 2011-06-13 19:50:55

+0

如果我的代碼在循環中,該怎麼辦? – Mikhail 2011-06-13 20:03:30