【问题标题】:Is it best practice to create new class for each jQuery call?为每个 jQuery 调用创建新类是最佳实践吗?
【发布时间】:2011-10-08 12:06:05
【问题描述】:

我有一个目录树结构。每次单击文件夹时,jQuery.ajax 都会触发并打开一个 jquery.php 文件。

这是我触发 jQuery.ajax 的 javascript 代码:

  jQuery('.directory').live('click',function() {

    // Get dir name clicked
    var dir = jQuery(this).find('span').html();

    // Update dir list
    getHTML('getDirList',dir, function(html){
      jQuery('#fileDirList').html(html);
    });

    // Update file list
    getHTML('getRowList',dir, function(html){
      jQuery('#fileList').html(html);
    });        
  });

  function getHTML(instance, dir, callback) {
      jQuery.ajax({
          type: "POST",
          url: "../wp-content/plugins/wp-filebrowser/jquery.php",
          dataType: 'html',
          data: {instance: instance, dir: dir},
          success: function(html){
              callback(html);
          },
          error: function(e) {
            callback('[Error] ' + e);
          }
      });
  }

在这个文件中,我的 jQuery.php 文件中有以下代码:

<?php

  class jQueryFactory {

  /**
   * Get and output directory list
   */  
  public function getDirList() {
    echo parent::getDirList();
  }


  /**
   * Get images and list them in row format
   */  
  public function getRowList() {
    echo parent::getRowList();
  }


  /**
   * Create new directory
   */  
  function createDir() {
    if(isset($_POST['new_dir'])) {
      $result = parent::createDir($_POST['new_dir']);
      echo $result;
    }
  }


  /**
   * Delete file
   */ 
  function deleteFile() {
    if(isset($_POST['file'])) {
      $file = $_POST['file'];
      parent::deleteImage($file);
    }
  }
}

// Does this work?
if(!isset($factory))
  $factory = new jQueryFactory();

switch($_POST['instance']) {
  case 'deleteImage'    : $factory->deleteFile(); break;
  case 'createDir'      : $factory->createDir(); break;
  case 'getDirList'     : $factory->getDirList($dir); break;
  case 'getRowList'     : $factory->getRowList($dir); break;
}   
?>

我的问题是:每次点击都必须触发这个功能吗? 或者我可以触发一次,然后在同一个用户会话中调用各种函数吗?

【问题讨论】:

  • 不确定你的意思。 jQueryFactory 是做什么的?您的意思是在 PHP 中跨多个 Ajax 调用持久化变量吗?
  • @Pekka - 我想在导航树结构时坚持jQueryFactory。但我不确定这是否可能?
  • 由于对象在脚本执行结束时死亡,不,您正在寻找的东西是不可能的。
  • @rodneyrehm,这就是我想知道的。谢谢:)

标签: php jquery


【解决方案1】:

您发出的每个 Ajax 请求都会在服务器端产生一个新请求。

在 PHP 中初始化每个请求的类和配置变量是正常的,所以你展示的方式很好,尝试跨请求持久化 jQueryFactory 对象不是一个值得追求的想法。这也应该不是什么性能问题。

如果该过程确实需要加快,请查看 opcode caching. 之类的内容

【讨论】:

    【解决方案2】:

    您可以将$factory 存储在$_SESSION 变量中吗?

    也许是这样的? (未经测试,我对 jQueryFactory 不熟悉)

    session_start();
    $factory = isset($_SESSION["factory"]) ? $_SESSION["factory"] : makeNewFactory();
    
    function makeNewFactory() {
      $fact = new jQueryFactory();
      $_SESSION["factory"] = $fact;
      return $fact;
    }
    

    【讨论】:

    • jQueryFactory extends FileBrowser 有一个包含根目录路径的变量。我认为暴露这将是一个安全漏洞。
    • @Steven 在会话中存储内容(与 cookie 不同)不会向客户端公开任何内容,因此这不是问题。但这可能没有任何意义——你必须在每次请求时为jQueryFactory 加载类bluepring,因此将对象存储在会话变量中的优势不会带来任何好处。
    猜你喜欢
    • 2018-05-22
    • 2012-05-26
    • 1970-01-01
    • 2012-05-26
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多