2011-09-14 30 views
3

我编写了下面的例程来根据我的codeigniter应用程序的选定国家来检索城市。如何不在js文件中硬编码codeigniter链接

$(document).ready(function() { 
    $("select#cbo_country").change(function() { 
     $.post("http://localhost/main/index.php/city/get_data_by_country", { 
      int_country_id : $(this).val() 
     }, 
     function(data) { 
      // some code here 
     },'json'); 
    }) 
}); 

,你可以看到,我硬编码的URL(HTTP://localhost/main/index.php/city/get_data_by_country),我知道这是一个不好的做法,但我不能帮助它。

有没有一个不干净的方式来不硬编码的网址?我曾经使用codeigniter的base_url(),但由于我将例程移动到一个js文件,我不能再使用该函数。

回答

10

采取的行动(主要是)从我的答案上How to get relative path in Javascript?

你有两个选择:

  1. 构建配置/偏好JavaScript对象,其中包含了所有的环境特定设置:

    var config = { 
        base: "<?php echo base_url(); ?>", 
        someOtherPref: 4 
    }; 
    

    ,然后用config.base前缀的AJAX网址。

    您必须将配置对象放置在由PHP解析的位置;标准选择在HTML元素<head>之内。别担心它的一个小配置对象,其内容可以在每个页面上更改,因此完全有理由将它粘贴在那里。

  2. 使用<base />HTML标记为所有相对URL设置URL前缀。这会影响所有相对URL的:形象的,链接等

就个人而言,我会去的选项1.你很可能会发现,配置对象派上用场了未来在其他地方。

+0

我忘了复出并挑选你的答案。我去选项2,因为我不认为base_url()将在.js文件上工作。谢谢。 – dqiu

+2

选项1更好,它不是一个js文件,它是一个PHP文件。 – qwertzman

2

更改"http://localhost/main/index.php/city/get_data_by_country""/main/index.php/city/get_data_by_country"无论你的基地址是什么,它都能正常工作。

这工作,因为main/index.php/说“从根开始并去index.php文件中的文件夹main”。

这是除非你的文档根目录文件夹设置为main文件夹,如果是的话,取出main

+0

会不会'/ index.php'链接,通过'http://本地主机/ index.php',而不是通过'http://本地主机/主/ index.php'? –

+0

是的,它会错过主要的文件夹部分。更新。 – Brandon

0

您可以做的一件事是将data-baseurl属性添加到页面上的元素(body元素工作)。然后你可以从JavaScript文件中抓取它。

<body data-baseurl="<?=base_url()?>"> 

然后在JavaScript:

$("select#cbo_country").change(function() { 
    var baseURL = $('body').data('baseurl') 
    $.post(baseURL+"city/get_data_by_country", { 
     int_country_id : $(this).val() 
    }, 
    function(data) { 
     // some code here 
    },'json'); 
})