0

我正在使用Select2 3.3.1,并且在某个事件中,我可以访问多个文本输入中更改的元素,该文本输入用作创建和删除在我的网站上使用的标签的地方。我在迭代事件处理程序中返回的对象时遇到问题。具体来说,我想这样做是因为我想访问各个标签,并且事件处理程序返回参数包含这些对象,这些对象按添加或删除标签进行组织。所以,这是极好的。但是我尝试过的一切都失败了。

.on("change", function(e) { 
    alert(JSON.stringify({val:e.val, added:e.added, removed:e.removed}));
    var added = JSON.stringify({added:e.added});
    $.each(added, function(){
        $.ajax({
            url: '/db-interaction/tags.php',
            data: {
                'action': 'addtag',
                'q': this
            },
            type: 'get',
            success: function(output) {

            }
        });             
    });

上面第二行的命令

alert(JSON.stringify({val:e.val, added:e.added, removed:e.removed}));

显示此字符串

{"val":["newtag"],"added":{"id":"newtag","count":"0"}}在警报中。

在这种情况下,我刚刚添加了单词“newtag”作为标签。我希望能够遍历这个内部列表中的这些项目。

我也尝试过双重嵌套循环,如下所示,但我得到了同样的错误。我不确定 JSON 字符串需要什么结构。

$.each(added, function(){
      $.each(this, function(){

ajax 请求似乎没有执行,但我找不到错误。成功函数不执行,firebug 控制台出现错误。它说TypeError: invalid 'in' operand e,指向 jquery 脚本。这是我的错误,我敢肯定。可能与我处理事件处理程序参数'e'的方式有关,但我不知道我做错了什么。

这是标签脚本。FWIW,addNewTag() 方法适用于其他用例。

<?php

session_start();

include_once "../inc/constants.inc.php";
include_once "../inc/class.tags.inc.php";
$tags = new Tags();

if (isset($_SESSION['LoggedIn']) && $_SESSION['LoggedIn']==1)
{
    if(!empty($_POST['action']) )
    {
        switch($_POST['action'])
        {
            case 'addtag':
                echo $tags->addNewTag();
                break;
            case 'removetag':
                echo $tags->removeTag();
                break;
            case 'getalltags':
                echo $tags->getAllTags();
            default:
                break;
        }
    }
    else if(!empty($_GET['action']))
    {
        switch($_GET['action'])
        {
            case 'addtag':
                echo $tags->addNewTag();
                break;
            case 'removetag':
                echo $tags->removeTag();
                break;
            case 'getalltags':
                echo $tags->getAllTags();
            default:
                break;
        }
    }
}
else
{
    header("Location: /");
    exit;
}

?>

还有 addNewTag() 方法,在其他情况下效果很好:

/**
 * Adds a new tag, increment uses_count if it already exists
 * 
 * 
 */
public function addNewTag($name=NULL)
{
    if ($name === NULL){
        if (isset($_POST['q']) )
            $u = $_POST['q'];
        else if (isset($_GET['q']))
            $u = $_GET['q'];
    }
    else{
        $u = $name;
    }

    $sql = "INSERT INTO tags(name,uses_count) VALUES (:term,1) 
            ON DUPLICATE KEY UPDATE uses_count=uses_count+1;";
    if($stmt = $this->_db->prepare($sql)) 
    {
        $stmt->bindParam(":term", $u, PDO::PARAM_STR);
        $stmt->execute();
        $stmt->closeCursor();
    }

谁能帮我吗?如果有用的话,我可以描述我尝试过的其他事情以及为什么它们没有奏效。

4

1 回答 1

1

尝试类似的东西

$.each(e.added, function(key, value){
    alert(key + ' - ' + value )
    $.ajax({
        url: '/db-interaction/tags.php',
        data: {
            'action': 'addtag',
            'q': this
        },
        type: 'get',
        success: function(output) {

        }
    });             
});

演示:小提琴

于 2013-03-15T03:40:16.617 回答