2017-02-10 61 views
1

我有一個按鈕應該調用帶有2個參數(整數和字符串)的動作。我使用Yii2。引用即使在轉義後也破壞了語法

<button class="button_answer" 
    onclick="submitAnswer(
      <?php echo $id ?>, 
      <?php echo '\''.Html::encode($title).'\''?> 
    );"> 
    Submit your answer 
</button> 

它是工作,但是當參數冠軍包含單引號雙引號語法被打破

我變成這樣的事情:

<button class="button_answer" onclick="submitAnswer(214, 'What's the ...?');"> 
    Post your answer 
</button> 

我不知道如何解決這個問題。

回答

5

您需要對JavaScript的PHP字符串進行編碼。然後你需要編碼HTML的JavaScript。

<?php 
$js_string_title = json_encode($title); 
$js = "submitAnswer($id, $js_string_title)"; 
$html_safe_js = htmlspecialchars($js); 
?> 

<button class="button_answer" 
    onclick="<?php echo $html_safe_js; ?>"> 
    Submit your answer 
</button> 

一個更好的辦法是完全避免內聯JS:

<button class="button_answer" 
     data-id="<?php echo htmlspecialchars($id); ?>" 
     data-title="<?php echo htmlspecialchars($title); ?>"> 
    Post your answer 
</button> 

隨着類似:

addEventListener("click", answer_handler); 

function answer_handler(event) { 
    var el = event.target; 
    if (el.classList.contains("button_answer")) { 
     submitAnswer(el.dataset.id, el.dataset.title); 
    } 
} 
+0

確定。它正在工作。感謝您的解釋。我認爲Yii框架的函數編碼集成了htmlspecialchars函數。 +1謝謝 – stfsngue

+0

@stfsngue - 它可能會......但它沒有理由加入'json_encode'。 – Quentin

+0

現在我明白了。至少我剛剛從你身上學到了一些東西。謝謝。我標記爲已解決。 – stfsngue

相關問題