JavaScript数组仅显示第一个字符

4

我目前正在开发一个 ckeditor 插件,这个下拉框从数据库获取数据,但是我只能在下拉框中看到第一个字符。

get_pages.php

$query = selectQuery('
    SELECT title, pageID
    FROM  `page_info` 
    WHERE partnerID =?',array($partnerId));
$test = '';
foreach ($query as $key => $value) {
$test .= $value['title'].",";
}

Plugin.js

var pages = $.post(
        "/action/ac_select_pages.php",
        { pid: "1" },
        function(data) {
            return (data);         
    }
);

pages = pages.responseText.split(',');

我的变量:

pages: Array[31]  
    0: "Home"  
    1: "Control Panel"  
    2: "24/7 Support"  
    3: "Script / Databases"  
    4: "Last Announcment"  
    5: "E-mail: No Limit"  
    6: "Webmail & Push Mail"  

我要做的是如何制作下拉框:

{
    type : 'select',
    id : 'moreinfo',
    label : 'Meerinfo Link',
    style : 'width:300px;',
    items : pages ,
    setup : function( element )
    {
    this.setValue( element.getAttribute( "moreinfo" ) );
    },
    commit : function( element )
    {
    var id = this.getValue();
    // If the field is non-empty, use its value to set the element's id attribute.
    if ( id )
    element.setAttribute( 'moreinfo', id );
    // If on editing the value was removed by the user, the id attribute needs to be removed.
    // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dom.element.html#removeAttribute
    else if ( !this.insertMode )
        element.removeAttribute( 'moreinfo' );
    }
}

你可以看到我只是把数组放在 items 中,但它只显示第一个字符。 对话框块

那么我做错了什么?


你能提供更多的代码吗? - El Hocko
4
你是如何生成下拉菜单的?你可能把字符串当作数组处理了。 - gen_Eric
@clph3r 根据您的要求,提供更多信息。 @RocketHazmat 从数据库中获取方式如下:page1,page2,page3 拆分以创建数组 将数组设置为项目所以在创建页面数组之前它是有效的,但是当我说items : pages时,它只获得第一个字符。它将第二个字符视为选项值 :S - Gert Kommer
你能详细说明一下“我如何制作我的选择框”部分吗?你只提供了一个对象,看到完整的命令会更有帮助。 - Ayman Safadi
尝试将本地数据放入select中。var pages = [{0: '主页',1:'控制面板',...}];如果您的select按预期工作,则我认为这是一个服务器端问题。如果这是一个服务器端问题,请尝试从您的php返回一个json并准备好在您的select中使用的数据。 - pbaris
@AymanSafadi 我不明白你的问题。这是 ckeditor 对话框内容的一个元素。该元素的设置都在那里。@pbaris 我尝试过了 :) 它可以工作,但由于页面不断添加和删除,我无法在选择器中硬编码页面。 - Gert Kommer
2个回答

1

因此,概括一下...

split() 将字符串对象拆分成字符串数组,方法是将字符串分成子字符串。

所以,你的 pages.responseText 可能看起来像这样:

Home,Control Panel,24/7 Support,Script / Databases,Last Announcment,E-mail: No Limit,Webmail & Push Mail

这意味着在执行pages = pages.responseText.split(',');之后,pages看起来像这样(一个数组):
["Home", "Control Panel", "24/7 Support", "Script / Databases", "Last Announcment", "E-mail: No Limit", "Webmail & Push Mail"]

根据你的先前评论,这个方法可以执行:
var pages = [{0: 'Home', 1: 'Control Panel', ...}];

正如您所看到的(一个包含多个值的数组):

["Home", "Control Panel", ...]

这不同于(一个具有多个属性的对象数组):

[{0: 'Home', 1: 'Control Panel', ...}]

如果这些仍然是真的,那么类似这样的内容应该可以工作:
var pagesObject = {};
for (var i=0, max=pages.length; i<max; i += 1) {
  pagesObject[i] = pages[i];
}

var correctPages = [ pagesObject ];

这里有一个演示:http://jsbin.com/ikazes/1/edit


我无法在家里访问代码,所以明天再试。提前感谢您的努力 :) - Gert Kommer

0
基于Ayman Sadadi的for循环,我终于弄对了:)
// page1, 1,00,page2, 12,00,page3, 23 \\
pages = pages.responseText.split(',00,');
// ["page1, 1","page2, 12","page3, 23"] \\
var a = [];
a[0] = '';
for (var b = 0; b < pages.length; b++) {
    var c = pages[b].split(', ');
    var pageName = c[0];
    var pageId = c[1];
    a[b] = [ pageName, c ];
};

a现在的值为:

a: Array[31]
  0: Array[2]
    0: "Home"
    1: Array[2]
      0: "Home"
      1: "1"
    length: 2
    __proto__: Array[0]
 1: Array[2]
    0: "Control Panel"
    1: Array[2]
      0: "Control Panel"
      1: "152"
    length: 2
    __proto__: Array[0]

这与所需的[['Home']['Control Panel']]相同。如果我将其用作我的项目,它可以正常工作。

之前的对话:

尝试在选择中放置本地数据。var pages = [{0:'Home',1:'Control Panel',...}];...


我试过了:)它可以正常工作,但是由于页面不断添加和删除,我无法在选择中硬编码页面


Ayman Safadi:根据您之前的评论,这有效...

只有当我像[['home']['Control Panel']]一样硬编码时,它才能正常工作。[{0: 'Home', 1: 'Control Panel', ...}]无法正常工作。对于我之前的意思有点不清楚,我很抱歉。

感谢Ayman Safadi / pbaris帮助我解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接