2017-02-10 57 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

相关问题