加载对话框内容并传递变量

时间:2014-07-05 07:30:02

标签: javascript php jquery

有几天,我无法弄清楚如何为以下问题设计解决方案:我有很多项目(大约1300个)存储在数据库中,每个项目都有自己的" id",some& #34;名称"第三个属性"启用"。

我想在同一页面上显示用户链接到(所有)对话框。然后,对话框应显示" name"并允许用户选择确定/取消(即启用/不启动)。 (更改"启用"是通过文件some_file.php进行的,该文件已经正常工作且不受此问题的影响。)

我发现类似的问题,如thisthis,但其中任何一个都不需要在php和javascript之间传递变量,就像我的对话框一样。

我无法在评论中解决下述问题:

的javascript:

$(function(){
  $('#dialog').dialog({
    autoOpen: false,
    width: 600,
    modal: true,
    buttons: {
        'Cancel': function() {
            $(this).dialog('close');
        },
        'OK': function() {
                $.ajax({
                    url: 'some_file.php',
                    type: 'POST',
                    data: 'item_id=' + id,// here I need to pass variable, i.e. $line["id"] from the php loop
                });
                $(this).dialog('close');
        }
    }
});
$('.link_dialog').click(function(){
    $('#dialog').dialog('open');
    return false;
  });
});`

html + php:

<?
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
// not sure here how to pass the "text" to some javascript function
    if ($line["name"]=="") {
      text = "Number ".$line["id"]." does not have any name.";
    } else {
      text = "The name of number ".$line["id"]." is ".$line["name"];
    }
}
?>
<a href='#' class='link_dialog'>Dialog 1</a>
<a href='#' class='link_dialog'>Dialog 2</a>
<a href='#' class='link_dialog'>Dialog 3</a>

<div id='dialog' title='Name' style='display: none;'>
    // not sure here how to extract the "text" from javascript function created above
</div>

jsfiddle demo (当然,不工作)

如果有人看到了这一点,我将非常感谢你的帮助。你可以更新我的jsfiddle。

2 个答案:

答案 0 :(得分:1)

在PHP中:

<?
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    if ($line["name"]=="") {
      $text[$line["id"]] = "Number ".$line["id"]." does not have any name.";
    } else {
      $text[$line["id"]] = "The name of number ".$line["id"]." is ".$line["name"];
    }
}

/***
 * Give each link unique ID (I've used 'dialog-n')
 * Advantage to creating link dynamically: 
 * (what if the number of dialogs changes in the future?)
 * Also suggest that you wrap these in a div
 */
$num_links = count($text);
for($i = 1; $i <= $num_links; $i++) {
    echo "<a href='#' id='dialog-$i' class='link_dialog'>Dialog $i</a>";
}

HTML:

<div id='dialog' title='Name' style='display: none;'>
</div>

在Javascript中:

    var DIALOG_TEXT = <?php echo json_encode($text); ?>; //Pass text via JSON

    $('.link_dialog').click(function() { 
      var link = this;

      //Get link ID
      var link_id = link.attr('id').split('-'); //Split string into array separated by the dash
      link_id = link_id[2]; //Second array element should be the ID number
      var msg_text = DIALOG_TEXT[link_id]; //Retrieve associated text

      //Insert text into dialog div
      $('#dialog').text(msg_text); //Use .html() if you need to insert html

      $('#dialog').dialog({
        buttons: {
          "Cancel": function() {
             $(this).dialog('close');
          },
          "OK": function() {
             $.ajax({
                      url: 'some_file.php',
                      type: 'POST',
                      data: 'item_id=' + link_id, //Use link id number extracted above
                    });
                    $(this).dialog('close');
          }
        }
      }); 
      return false;
    });

我没有对上述内容进行测试,您可能需要根据需要进行修改。

选项2:

如果您打算动态生成对话框内容(例如,仅当用户点击链接时),您可以执行以下操作

jQuery('#dialog').load('content_generator.php?item_id=**[your id]**').dialog('open'); 

其中&#39; content_generator.php&#39;获取给定的id并输出相应的文本,&#34; .load()&#34;插入对话框。

选项2基于Sam here

给出的答案

答案 1 :(得分:0)

您要做的是称为动态内容加载。我的最后一个例子是通过插入必要的数据(作为JSON)并直接在页面上生成内容来实现的。

下一种方法可能不适合您尝试的操作,但稍后可能会有用。

我们使用外部页面为我们提供内容,而不是检索数据并在页面上生成内容。这通过仅提供所需内容来减少服务器负载,并且可以增加用户交互性(因为页面在向用户显示之前不必加载所有信息)。有关AJAX的更多信息,请参见[此处] [1]。

优点:将内容生成与用户访问的页面分开。如果您需要在网站上的其他地方显示相同/类似的内容,该怎么办?此方法允许您为多个用例重用代码。

您甚至可以将其与之前的方法结合使用。只需使用一个单独的PHP文件来生成对话框内容和链接(而不是每次单击,如下所示),它将被调用并加载到$(document).ready()

每次点击示例:

生成每次点击的内容

单独的PHP文件 - dialog_text_generator.php:

<?
  //DON'T ACTUALLY DO THIS. ALWAYS SANITIZE DATA AND AVOID USING mysql_ prefixed
  //functions (use mysqli or PDO). 
  //This is just to illustrate getting data from the DB
  $item_id = $_REQUEST['item_id'];
  $query = "SELECT * FROM `stuff` WHERE item_id = $item_id";
  $query_results = mysql_query($query, $db_connection);

  $num_matches = count($query_results);
  $text = array();
  for($i = 0; $i < $num_matches; $i++) {
    $current_item = $query_results[$i];

    //Print out content
    //replace 'name' with whatever field your DB table uses to store the item name
    if($current_item['name'] == '') { 
      echo "<p>Number $item_id does not have any name.</p>";
    } else {
      echo "<p>The name of number ".$item_id." is ".$current_item['name']."</p>";
    }
  }
?>

主页中的Javascript:

<script>
$('.link_dialog').click(function() { 
      //On user clicking the link
      var link = this;

      //Get link ID
      var link_id = link.attr('id').split('-'); //Split string into array separated by the dash
      link_id = link_id[2]; //Second array element should be the ID number

      //autoOpen set to false so this doesn't open yet, we're just defining the buttons here
      $('#dialog').dialog({
        autoOpen: false, 
        buttons: {
          "Cancel": function() {
             $(this).dialog('close');
          },
          "OK": function() {
             $.ajax({
                      url: 'some_file.php',
                      type: 'POST',
                      data: 'item_id=' + link_id, //Use link id number extracted above
                    });
                    $(this).dialog('close');
          }
        }
      }); 

      //Load content from PHP file into dialog div and open the dialog
      //Obviously use the actual path to dialog_text_generator.php
      jQuery('#dialog').load('dialog_text_generator.php?item_id='+link_id).dialog('open');

      return false;
    });

</script>