我已经尝试过几次了解Singleton是什么.也许我只是太过视觉化......所以任何人都可以用一个简单的比喻来分解它.
类似帖子:
我有一个具有多个属性和函数的全局JavaScript对象,我正在以这种方式创建它:
myObject = {};
Run Code Online (Sandbox Code Playgroud)
我认为我可以通过创建这样的东西轻松扩展这个对象
myObject = { propA1 : null, ....., propAN : null};
Run Code Online (Sandbox Code Playgroud)
代替
myObject.propA1 = null;
myObject......;
myObject.propAN = null;
Run Code Online (Sandbox Code Playgroud)
我的做法有什么问题?
我正在使用HTML/JavaScript开发Web应用程序,我想阻止用户在浏览器控制台中调用函数以避免作弊.所有这些函数都包含在一个唯一的文件functions.js中,该index.html文件被加载到文件的头部.
在网上搜索后,我发现这个解决方案在谷歌浏览器中运行良好,但在Firefox等其他浏览器中效率很低:
var _z = console;
Object.defineProperty( window, "console", {
get : function(){if( _z._commandLineAPI ){ throw "Script execution not permitted" } return _z; },
set : function(val){ _z = val }
});
Run Code Online (Sandbox Code Playgroud)
是否有通用的方法来禁用从控制台调用函数?它取决于浏览器还是只是一个范围问题,或者是我忽略的其他东西?
我有两个外部JavaScript lib文件,我必须在同一个JSP页面上加载.它们都有一个名为"autoSave()"的函数,两者都没有参数.我不能修改他们的签名,因为他们不是我的脚本文件.
如何显式调用脚本A或脚本B中的函数?如何确定优先顺序?
我的JavaScript代码几乎不是一个Ajax请求,它要求从后端返回XML.后端可以execute_callback作为XML标签之一返回,如下所示:
<?xml version="1.0" encoding="windows-1251"?>
<response>
<execute_callback>
<function_name>someFunction</function_name>
</execute_callback>
</response>
Run Code Online (Sandbox Code Playgroud)
只要你知道这个callback预期的参数数量,一切都会好的.但如果后端已经返回怎么办?
<?xml version="1.0" encoding="windows-1251"?>
<response>
<execute_callback>
<function_name>someFunction</function_name>
<param>10.2</param>
<param>some_text</param>
</execute_callback>
<execute_callback>
<function_name>otherFunction</function_name>
<param>{ x: 1, y: 2 }</param>
</execute_callback>
</response>
Run Code Online (Sandbox Code Playgroud)
我现在如何将参数10.2和'some_text'传递给someFunctionJSON {x:1,y:2} otherFunction?
我知道一个丑陋的解决方案(使用函数arguments),但我正在寻找一个漂亮的解决方案.
在我忘记之前:不要为我解析XML - 我可以自己解决这个问题:)我需要的只是一些技巧,可以将任意数量的参数传递给JavaScript中的函数.如果您了解Python,我想要:
def somefunc(x, y):
print x, y
args = { 'x' : 1, 'y' : 2 }
somefunc(**args)
Run Code Online (Sandbox Code Playgroud)
但在JavaScript中.
最近我开始为 Chrome 开发一些扩展。我在清单 v3 和普通 javascript 中执行此操作。我已经成功地让我的扩展工作了。然而,创建它们的部分乐趣在于学习更好的编码。我一直想知道我是否以正确的方式处理变量。
我喜欢从扩展程序中的各个点访问一些数据。其中一些是动态加载的,一些是我直接在代码中设置的,如下所示:
const myExtensionData = {
someData: [],
config: [],
links: [],
}
Run Code Online (Sandbox Code Playgroud)
1) 将常用数据存储在像 myExtensionData.someData 这样的变量中是个好主意吗?有更好的选择吗?
myExtensionData.someData在某个时间点从外部加载。当我在各种函数中使用这些数据时,我将其公开为这样,这样我就不必每次都传递数据。我可以使用本地存储,但我一直保留它,因为这需要另一个权限。
2)同样的问题,但这次是很少使用的东西(myExtensionData.config)?
中的数据myExtensionData.config也是动态创建的,但内容使用得不多。例如:我存储是否还安装了我的其他扩展之一。如果是,我启用一个按钮以从弹出窗口访问它。而是一次性使用。
3)静态变量怎么样?(myExtensionData.links)?
我保留了一些用于 onUpdate、onInstall 和发行说明的链接。它们会定期变化,所以我需要将它们存放在某个地方。将它们存储在 myExtensionData 中怎么样(实际上我目前将它们保存在全局常量中)。
4)任何指点都表示赞赏! 我希望这是一个有价值的问题。虽然不是很具体,但我相信我可以在这里学到很多东西。我搜索了良好实践/最佳实践,但它们通常超出了扩展的范围。如果我看错了地方,请告诉我。
我在这个非常古老的问题中发现了一些有趣的东西。据我了解,将变量存储在对象中并不是一件坏事。此外,我喜欢还建议向对象添加一些方法。
我试图将表单发布到隐藏的,动态插入的iframe,但在Internet Explorer中,表单提交将在新窗口中打开.
var iframe = document.createElement('iframe');
iframe.name = 'hidden_iframe';
iframe.className = 'NotVisible';
iframe.id = 'hidden_iframe';
document.body.appendChild(iframe);
var my_form = document.getElementById('my_form');
my_form.target = 'hidden_iframe';
Run Code Online (Sandbox Code Playgroud)
这适用于Firefox但不适用于Internet Explorer.
在我们的代码库中,我们有两个,我不明白何时使用哪个......
在情况下<input type="hidden" id="someFlag" />,我们写/以下列方式读取值$("#someFlag").val('1');和 $("#someFlag").val() == '1'
为什么不简单地将全局变量添加到JavaScript文件中?
var someFlag2;
...
someFlag2 = '1';
someFlag2 == '1'
Run Code Online (Sandbox Code Playgroud)
这些方法之间是否存在一些差异?
我想知道当变量需要在同一模块中的多个函数中使用时,防止变量为全局的最佳方法是什么.
正如你所看到的那样,我需要在整个过程中提供这些变量 - 但是我并不一定希望在全局中定义这些变量,因为最终会把事情搞得一团糟.我将它们包装在一个函数中吗?
此外,如果有人提出改进此代码的方法,我很乐意听到它.
这是我的代码示例:
// Info Bullet Slide Out
var slideOut,
clickedButton,
clickedParent,
activeClass = 'is-active',
openClass = 'is-open';
function closeSlideOut(){
$('.tlx-img-point').removeClass(activeClass);
slideOut.removeClass(openClass);
clickedParent.removeClass(activeClass);
}
function openSlideOut(){
slideOut = $('.' + clickedButton.attr('id'));
slideOut.addClass(openClass);
clickedParent.addClass(activeClass);
clickedButton.addClass(activeClass);
}
$('.tlx-img-point').on('click', function(){
clickedButton = $(this);
clickedParent = clickedButton.parent();
// If you clicked on the same button twice just close the slideout
if($(this).hasClass('is-active')){
closeSlideOut();
// If you clicked on another info button close this one and open the new one
}else if(clickedParent.hasClass(activeClass)){
closeSlideOut(); …Run Code Online (Sandbox Code Playgroud) 我的函数change_slide()收到错误.
ReferenceError: change_slide is not defined在第24:1行.我的代码在这里:
$(document).ready(function() {
function change_slide() {
number = pclass.charAt(6);
number = parseInt(number);
if (number == 5) number = 1;
else number++;
$('.picks').removeClass(pclass);
pclass = 'bgpick' + number;
$('.picks').addClass(pclass);
}
var random = Math.floor((Math.random() * 5) + 1);
var pclass = 'bgpick' + random;
var number;
$('.picks').addClass(pclass);
setInterval('change_slide()', 3000);
$('.next').on('click', function() {
change_slide();
});
});
Run Code Online (Sandbox Code Playgroud)
单击.next上的change_slide()工作,在setInterval中不起作用.