用户
 找回密码
 入住 CI 中国社区
搜索
查看: 11805|回复: 13
收起左侧

[已解决] 使用CI时,怎样才能让JS调用绝对路径?

[复制链接]
发表于 2009-7-1 17:50:35 | 显示全部楼层 |阅读模式
我的网站是CI做框架,前台用的是jquery,本地开发环境是用XAMPP搭建的。

目录结构如下(省略与问题无关的目录):
G:\xampp\htdocs\juyi
                  ├css
                  ├js
                  │└sale.js
                  ├images
                  │└no_pic.gif
                  └system(这个就是CI)
                         └application
                                 ├controllers
                                 │└sale.php
                                 └views
                                      └sale.php



sale.js

--------------------------------------------------------------------
$(function(){
    // 用来确认当前的绝对路径
    alert(document.location.href);
    // 用默认图片来代替缺失图片
    $('.community_list img').error(function(){
        $(this).attr('src', 'images/no_pic.gif');
    });
});


controller的代码比较复杂,就不贴出来了。
现在的情况是:当访问http://localhost/juyi/sale的时候,图片的路径是http://localhost/juyi/images/no_pic.gif;而访问[url=http://localhost/juyi/sale/]http://localhost/juyi/sale/参数[/url]时,图片的路径跟着变成了http://localhost/juyi/sale/参数/no_pic.gif。
我需要的是:无论sale后面的参数怎么变,图片的路径都不会跟着变。目前我是将JS里的代码修改为$(this).attr('src', 'http://localhost/juyi/images/no_pic.gif');

希望大家能提出更好的解决方案。:)
发表于 2009-7-1 18:00:14 | 显示全部楼层
我的方法是用 CI 生成 js 代码来做这件事。
 楼主| 发表于 2009-7-1 18:35:00 | 显示全部楼层
我的方法是用 CI 生成 js 代码来做这件事。
Hex 发表于 2009-7-1 18:00

不使用js文件,直接将JS代码写在VIEW里吗?
发表于 2009-7-1 18:35:30 | 显示全部楼层
apache rewrite之后最好用绝对路径,当然也有其他解决办法,例如数组替换
src=/, src='/, src="/
替换为
src=http://localhost/juyi/, src='http://localhost/juyi/, src="http://localhost/juyi/
以上替换需要扩展CI_Loader实现
 楼主| 发表于 2009-7-1 18:46:19 | 显示全部楼层
apache rewrite之后最好用绝对路径,当然也有其他解决办法,例如数组替换
src=/, src='/, src="/
替换为
src=http://localhost/juyi/, src='http://localhost/juyi/, src="http://localhost/juyi/
以上替换需要扩展C ...
visvoy 发表于 2009-7-1 18:35

也就是说,这个问题和CI无关,而是rewrite的问题对吧?
visvoy所说的数组替换是怎么个替换法?是JS代码还是PHP代码?能提供个思路吗?
发表于 2009-7-1 19:05:20 | 显示全部楼层
本帖最后由 visvoy 于 2009-7-1 19:08 编辑

用php替换输出的内容,我们可以通用的认为视图文件里面的图片地址皆以斜线“/”开头,
那么,图片的链接形式就几种:src=,href=,url(,background=
每个等号或小括号后面可能直接跟斜线,或者单引号+斜线,或者双引号+斜线,

于是构造source数组:
src=/,src='/,src="/,
href=/,href='/,href="/,
url(/,url('/,url("/,
background=/,background='/,background="/

再构造dest数组:
src=$img_path/,src='$img_path/,src="$img_path/,
href=$img_path/,href='$img_path/,href="$img_path/,
url($img_path/,url('$img_path/,url("$img_path/,
background=$img_path/,background='$img_path/,background="$img_path/

然后str_replace($sourceArray,$destArray,$outputContent)

如何在CI里面获取最后的输出内容并且强暴它呢?
有两个途径,一是扩展CI_Output的某函数,另外是扩展CI_Loader的某函数
具体哪两个函数看一下这两个类的源码和注释吧,懒得找了

ps: js代码替换会造成网页首先显示很多叉叉,然后再出现图片,不够美观,不使用
发表于 2009-7-1 19:07:17 | 显示全部楼层
本帖最后由 visvoy 于 2009-7-1 19:11 编辑

edit: 替换代码嵌进去之后,只需要修改$img_path即可适应路径的变化了
发表于 2009-7-1 23:44:10 | 显示全部楼层
呵呵,我目前的做法是在视图里用 PHP 生成一个全局 js 变量,里面存储当前应用的根 URL,然后再其它 .js 文件中直接使用这个“特殊”的全局变量。目前来看效果非常好。
 楼主| 发表于 2009-7-2 19:59:51 | 显示全部楼层
已经解决了。目前看来效果很不错!
做法是,在view里面的<head></head>里面加入<base href="<?=base_url()?>"/>,JS里面的代码不用改动,仍然使用相对路径就行
$(this).attr('src', 'images/no_pic.gif');

我对整站的代码(包括JS和CSS)都照这个方法修改了一下,运行很正常。
发表于 2009-8-9 04:15:03 | 显示全部楼层
楼上的方法确实不错 呵呵  特此感谢!

本版积分规则