2012-06-08 24 views
2

我有一個PHP應用程序,利用了一個Listener類,它基本上只是用jQuery(下面的例子)設置一個Ajax請求。但出於某種原因,迴應JavaScript似乎不夠雅緻。是否更好的做法是建立一個單獨的類來傳遞給javascript(這可能會引入耦合)或只是像我現在正在做的那樣回顯腳本?這是不好的做法回聲JavaScript與PHP

下面是我正在做的事情的代碼片段。

<?php 

     $script = " 
        <script> 
        $(document).ready(function(){ 
         $('".$trigger."').".$action."(function() { 
         ".$js_variables." 
          var ajax_load = ''; 
          var loadUrl = '".$this->controller_path."'; 
          var action = $(this).attr('id'); 

          $('".$this->parent."') 
          .hide(2) 
          .html(ajax_load) 
          .load(loadUrl, {action: action, ".$post_mapper."}) 
          .fadeIn(800); 
         }); 
        }); 
       </script> 
     "; 

     echo $script; 

?> 

編輯:使用一個單獨的類也將允許我使用$(document).ready()或快捷版$(function(){})只有一次,而不是每一次我添加了一個偵聽器。但我不確定這是否值得花費額外的時間和精力......任何想法?

+0

根本沒有,它同樣可以接受。 – uday

+0

我相信用php回顯javascript是很常見的做法。這種常見做法是否很好,完全是另一個問題。 –

+0

我個人不喜歡混合服務器端和客戶端代碼的想法,但是沒有任何問題。 –

回答

2

mm這是所有的偏好......我通常會這樣做,所以我的文本編輯器將能夠確定什麼是JavaScript和什麼是PHP,所以它不會讓我的眼睛流血嘗試着看非代碼色文本。

<script> 
    $(document).ready(function(){ 
     $('<?php echo $trigger ?>').<? echo $action ?>(function() { 
      <?php echo $js_variables ?> 
      var ajax_load = ''; 
      var loadUrl = '<?php echo $this->controller_path ?>'; 
      var action = $(this).attr('id'); 

      $('<?php echo $this->parent ?>') 
       .hide(2) 
       .html(ajax_load) 
       .load(loadUrl, {action: action, <?php echo $post_mapper ?>}) 
       .fadeIn(800); 
      }); 
    }); 
</script> 
+0

我也是這樣做的,出於同樣的原因:IDE比其他顏色編碼好得多。 –

+3

-1:不知道爲什麼有人會投票贊成,它確實是一團糟,可能很難調試。更好地保持數據和交互的分離。將JS保留在HTML文件之外。 – zzzzBov

+0

我不推薦他在HTML文件中使用JS。我只是用他給的例子。通常我會在我的JS文件中創建函數,並通過回顯php值來發送參數。但是你不能在某處回覆PHP值,因爲它們來自服務器端。 – James

6

它是不好的做法用PHP呼應的JavaScript?

一般:是

這是一個常見的做法是從PHP呼應的JavaScript,但我非常不鼓勵它。

在大多數情況下,你能避免受以下前端MVC結構混合的語言:

HTML所屬.html *文件。這是模型。
CSS屬於.css文件。這是觀點。
JS屬於.js文件。這是控制器。

我發現很少見,我實際上需要從服務器端語言生成JavaScript。大多數情況下,我真正需要的是傳遞JavaScript可以使用的信息。的

而不是試圖輸出:

<a href="#" id="foo">bar</a> 
<script> 
    $('#foo').click(function() { 
     $.ajax('http://example.com')... 
     return false; 
    }); 
</script> 

的每一個環節,儘量使用本地HTML屬性做最繁重的工作:

<a href="http://example.com/" class="ajax-link">bar</a> 

,並在你的腳本,你可以有:

$(document).on('click', '.ajax-link', function() { 
    $.ajax($(this).attr('href'))... 
    return false; 
}); 

委託函數只需綁定一次,並可以從靜態JS f ile,而不需要嘗試將JS注入到PHP代碼中。

如果您需要通過更多信息傳遞,請使用data-* attributes.data(...)一起使用。

*或.php或用於模板的任何其他服務器端語言。


有利基原因迴應客戶端代碼從服務器。一個例子是爲JSONP API生成JSON,您需要動態生成回調。

如果沒有真的很好的理由與服務器端語言生成JS,不要。

1

一如既往取決於。如果你正在寫一個小應用程序,這個混合物不會傷害你。當一個應用程序增長到一定的規模時,我個人覺得更容易維護,當我不在一個文件中混合使用語言時。

歷史告訴我們前端不要在一個文件中混合使用HTML,JavaScript和CSS。將它們分開是更好的選擇,否則在試圖追蹤錯誤時很難找到正確的位置。混合使用JavaScript和服務器端語言並不好。我覺得還有一些東西我覺得沒問題。例如。配置或本地化文件,需要具有動態值。

在你的例子中,我寧願保持它分開。您所做的一切都可以通過HTML元素上的(數據)屬性和一些DOM查找完成。它似乎也需要爲您的視圖收集一些信息,這些信息最好存儲在HTML中。例如:$action這可能是源自一種形式非常簡單:

HTML

<from method="POST" action="/you-name-it"> 
    ... 
</form> 

JS

$(function(){ 
    var form = $('form'); 
    $.ajax({ 
     type: "POST", 
     url: form.attr('action'), 
     data: form.serialize(), 
     success: function(response) { 
     console.log(response); 
     } 
    }); 
}); 

爲什麼這個確切的形式提交的邏輯,可以在JavaScript和/或PHP 。他們如何交流並不重要。

1

這是完全可以接受的,但有點冒險 - 您正在生成JS的部分,這意味着您必須生成VALID JS代碼,否則整個代碼塊將被語法錯誤殺死。

例如如果你使用PHP中插入JS代碼塊中的PHP變量的值,是這樣的:

<script type="text/javascript"> 
var last_name = '<?php echo $last_name ?>'; 
</script> 

和last_name $恰好是O'Brien,你現在又推出了一個語法錯誤,因爲生成代碼將是:

var last_name = 'O'Brien'; 
       ^^^--- string with contents O 
        ^^^^^--- unknown/undefined variable Brien 
        ^^--string followed by variable, but no operator present. 
         ^--- start of a new unterminated string containing a ; 

任何時候你要插入原始的基於PHP的數據轉換成一個Javascript變量,你基本上必須使用json_encode(),這保證了生成的JS數據在語法上是有效的JS代碼:

var last_name = <?php echo $last_name ?>; 

請注意,我沒有將'放入此版本 - json_encode會爲您提供幫助。

相關問題