我在RequireJS上遇到了一些问题。
我有一个带有几个控件的.NET站点,其中包含需要.NET生成的参数的JS代码。我一直在尝试将RequireJS应用到我的网站中,但我遇到了一个小问题。
我在页面顶部包含了引用RequireJS的脚本标记,以及对该脚本标记内的main.js的引用。在我的main.js中,我有以下代码;
require.config({
paths: {
'jquery' : '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min'
}
});
然后我有一个应该显示Flash视频的Web控件。此Web控件包含以下代码段;
require(['jquery'], function ($) {
if (!eval('<%= FlashAvailable.ToString().ToLowerInvariant() %>')) {
var url = '<%= FallbackImageUrl %>';
if (!url) {
$("#flashcontent").remove();
}
return;
}
var link = '<%= Page.ResolveUrl("~/Templates/AlloyTech/scripts/slideshow.swf") %>';
var width = '<%= Width %>';
var height = '<%= Height %>';
var variables = { xml: '<%= ConfigXml %>' };
var params = { wmode: 'transparent' };
var attributes = { };
swfobject.embedSWF(link, 'flashcontent', width, height, '10', false, variables, params, attributes);
});
这应该可以正常工作吗?但是,执行页面会导致两组错误。
1. GET http://episerversite6/scripts/jquery.js 404 (Not Found)
2. Uncaught Error: Script error http://requirejs.org/docs/errors.html#scripterror
当我为jquery定义路径时,为什么要查找jquery.js是'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min'。我已经尝试为路径添加第二个参数,这是一个本地回退jQuery文件,这使一切正常,但我仍然在控制台中收到第一个错误。
其次,为什么我收到了scripterror消息?我已经多次检查了我的代码,我似乎无法找到它的任何问题。在jQuery有时间加载之前,它是否与正在执行的代码有关?
所以我想我要问的是,使用内联脚本使用RequireJS的最佳方法是什么?我希望有人能帮帮忙。提前谢谢。
答案 0 :(得分:1)
似乎我误解了RequireJS的工作方式以及相应重写代码的需要。
所以我决定做的是将所有ASP.NET生成的变量附加到它们作为data- *属性影响的元素,并将所有JavaScript代码移动到单个文件,然后在main.js脚本中引用在页面加载时运行。稍后在加载脚本及其依赖项时获取data- *属性值。
所以这就是我在最初的问题中提到的项目,这实际上是一个名为Alloytech的EPiServer CMS演示项目。
Flash.ascx
<div id='flashcontent' data-flash-available="<%= FlashAvailable.ToString(CultureInfo.InvariantCulture).ToLowerInvariant() %>"
data-fallback-image="<%= FallbackImageUrl %>"
data-flash-link="<%= Page.ResolveUrl("~/Templates/AlloyTech/scripts/slideshow.swf") %>"
data-flash-width="<%= Width %>"
data-flash-height="<%= Height %>"
data-flash-variables="<%= ConfigXml %>">
<img src='<%= FallbackImageUrl %>' alt='<%= FallbackImageAlt %>' />
</div>
main.js
require.config({
shim: {
'swfobject' : {
exports: 'swfobject'
}
},
paths: {
'jquery': ['http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min', '/Scripts/jquery-1.7.2.min'],
'alloytech': '/templates/alloytech/scripts/alloytech',
'mobile': '/templates/alloytech/scripts/mobile/mobile',
'swfobject': '/Templates/AlloyTech/scripts/swfobject'
}
});
define(['jquery', 'alloytech', 'mobile', 'swfobject'], function ($, A, M, swfobject) {
$.fn.addFlash = function () {
return this.each(function () {
var el = $(this);
var flashAvailable = el.data('flash-available'),
fallbackImage = el.data('fallback-image'),
flashLink = el.data('flash-link'),
flashWidth = el.data('flash-width'),
flashHeight = el.data('flash-height'),
flashVariables = el.data('flash-variables');
if (!eval(flashAvailable)) {
var url = fallbackImage;
if (!url) {
el.remove();
}
return;
}
var link = flashLink;
var width = flashWidth;
var height = flashHeight;
var variables = { xml: flashVariables };
var params = { wmode: 'transparent' };
var attributes = {};
swfobject.embedSWF(link, 'flashcontent', width, height, '10', false, variables, params, attributes);
});
};
$(function () {
$("#flashcontent").addFlash();
});
});
我希望其他人会觉得这很有用。
答案 1 :(得分:0)
它在配置路径加载之前寻找所需的模块“jquery”。所以基本上require.js会假设“jquery”是一个javascript文件,并试图在与“data-main”相同的目录中查找它(在HTML标题中定义)。
我不知道这种特殊情况的解决方案是什么,因为我正在打同一场战斗,但这似乎与jquery.js创作者打算使用插件的方式不同的方式来判断此页面:Common Errors