根据元素是否定义在页面中服务备用外部JavaScript文件

问题描述:

好的,这里是我的第一个问题。根据元素是否定义在页面中服务备用外部JavaScript文件

设置:我们使用基于JavaScript的工具来对我们的着陆页设计进行A/B测试。我需要版本A(控制)链接到一个外部JavaScript文件,而版本B(变体)链接到另一个JavaScript文件。

目标:在控件的底部有一个内部js脚本,用于查看该工具是否实际上服务于A或B,如果为true,哪个服务。结果表明应该链接哪个外部脚本。

问题:无论该工具是否实际上服务于A或B,原始脚本都先链接,然后如果检测到该工具,则在此之后将链接相应的脚本。

这里是我的代码(我提前道歉对任何错误新手):

//script at bottom of original or tool-served control html page template 
<script type="text/javascript"> 
valForTool = function() { 
    var variationId = _tool_exp[_tool_exp_ids[0]].combination_chosen; 
    if (variationId == 1) { 
    var newScript = document.createElement('script'); 
    newScript.type = 'text/javascript'; 
    newScript.src = 'js/scripts.js'; 
    document.body.appendChild(newScript); 
    }; 
} 
originalValidation = function() { 
    var newScript = document.createElement('script'); 
    newScript.type = 'text/javascript'; 
    newScript.src = 'js/scripts.js'; 
    document.body.appendChild(newScript); 
} 
$(function(){ 
    if (typeof _tool_exp_ids !== 'undefined' && typeof _tool_exp_ids[0] !== 'undefined') { 
    valForTool(); 
    } else { 
    originalValidation(); 
    }; 
}); 
</script> 
//end script on control or original template 

//script on tool-served variation html template - will run after the above script 
<script type="text/javascript"> 
$(function() { 
    $('#project_info input[type=submit]').removeAttr('disabled'); 
    $('#project_info').unbind(); 
    var newScript = document.createElement('script'); 
    newScript.type = 'text/javascript'; 
    newScript.src = 'js/scripts2.js'; 
    document.body.appendChild(newScript); 
    $('.input_text').parent().addClass('contact_field'); 
}); 
</script> 
// end script on variation template 

任何想法,我做错了吗?我提供了足够的信息吗?谢谢!我喜欢这个网站作为我的问题的参考,但这是我第一次真正发布一个。

+0

如果您登录它们,_tool_exp_ids和_tool_exp_ids [0]是否都是未定义的?因为如果他们不是这个问题的话,他们可能会在上面的代码以外设置它们。 – GillesC 2012-04-17 21:10:50

+0

不回答你的问题,但你应该追加你的js文件到'head'标签和一个更多的建议,你可以使用[$ .getScript()](http://api.jquery.com/jQuery.getScript/)它是更有用。 – ocanal 2012-04-17 21:16:42

+0

感谢您的快速回复!我担心我的问题可能对我应该在此发布的内容太具体。也许更常见的问题是,我可以链接特定的外部JavaScript文件,具体取决于是否触发第三方脚本(在本例中为a/b测试工具)?我正在尝试记录工具ID,结果不一致 - 有时会定义,有时还未定义,即使工具脚本应该触发。 – monnie 2012-04-17 22:00:52

缩短下来了一点,好像你只是这样做:

<script type="text/javascript"> 
$(function(){ 
    if (typeof _tool_exp_ids !== 'undefined' && typeof _tool_exp_ids[0] !== 'undefined') { 
     var variationId = _tool_exp[_tool_exp_ids[0]].combination_chosen; 
     if (variationId == 1) { 
      $.getScript('js/scripts.js', function() {runSecond();}); 
     } 
    }else{ 
      $.getScript('js/scripts.js', function() {runSecond();}); 
    } 

    function runSecond() { 
     $('#project_info input[type=submit]').removeAttr('disabled').unbind(); 
     $.getScript('js/scripts2.js'); 
     $('.input_text').parent().addClass('contact_field'); 
    } 
}); 
</script> 

现在看那个,很明显,这两个脚本的运行,无论在那些满足什么样的条件if/else语句,我并没有真正明白你想要做什么,但我会做的第一件事是添加一些console.logs来查看这些if/else语句是否像他们应该的那样工作,然后计算出什么应该在哪些条件下加载脚本等?

+0

感谢您缩短它!我可以在这里做一个if/else if/else语句吗?或者如果&&/else?因为如果variationId == 2(用于变体),我想获取scripts2.js文件而不是scripts.js文件。我有两种情况用于链接第一个脚本:如果测试脚本没有运行,并且它正在运行并为控件提供服务。第三种情况是测试脚本正在运行并提供变体。我正在做更多的日志记录来弄清楚如何监听测试脚本是否正在运行。上述解决方案之前工作过,但现在他们在控件上使用了一个异步代码片段。 – monnie 2012-04-17 22:22:12

+0

更新:现在我看到你是如何包含scripts2.js的。我会试试这个:) – monnie 2012-04-17 22:35:11