更新:由于没有答案,我正在稍微改变这个问题.以下链接在Dean的博客上的帖子的评论表明这种技术在Safari中不起作用.
我现在的问题是:下面描述的技术在现代浏览器中是否有效*,特别是有人可以确认它是否适用于Safari?
这是一篇更新的博客文章.它曾经说过:
Sandboxed natives ...在各种浏览器中都受支持,包括...... Safari 2.0+
...但后来说iframe技术"除了Safari之外的所有主流浏览器都支持",而且他所展示的后备涉及使用伪造的构造函数做一些奇怪的事情,而且__proto__看起来有点hacky.
我几乎发现很难相信两个不同的窗口实际上可以共享相同的内容,例如Object.prototype.跨域iframe会发生什么?如果我在一帧中修改原型,那么另一帧中的原型是否会被修改?这似乎是一个明显的安全问题.有人请说明这种情况.
*我的意思是"工作" My.Object != Object,所以可以在一个窗口中修改原型而不影响另一个窗口.
原帖
我知道之前已经问过这个问题,但我有一个特定的解决方案,我想知道这种解决方案之前是否已经讨论过,我想知道它是多么可靠和被广泛接受.
问题是如何在javascript中扩展本机类型而不会实际上弄乱类型本身,所以只是改变Array.prototype是不好的(也许其他代码使用for..in与数组).创建一个返回带有某些函数的本机数组的伪构造函数似乎也不是一个好的解决方案,实际上扩展本机对象似乎更好.但你不能用原生类型做正常的javascript虚函数原型switcharoo样式扩展,因为当你试图调用本机函数时,你会得到像"push is not generic"这样的错误.
所以,我想到的解决方案是这样的:创建另一个窗口,在该窗口中向原生构造函数的原型添加功能,并在程序中使用这些构造函数.
此示例扩展Array为My.Array具有each功能和String作为My.String具有alert功能.
var My = (function(){
// create an iframe to get a separate global scope
var iframe = document.createElement('iframe');
iframe.style.height = '0px';
iframe.style.width = '0px';
iframe.style.border = 'none';
iframe.style.position = 'absolute';
iframe.style.left = '-99999px';
document.documentElement.appendChild(iframe);
var My = iframe.contentWindow;
My.String.prototype.alert = …Run Code Online (Sandbox Code Playgroud) 更新 -感谢所有回复.这个问题变得有些混乱,所以如果有人感兴趣,我就开始续集了.
我正在为朋友拼凑一个快速脚本,并偶然发现了一种在PHP中进行模板化的简单方法.
基本上,我们的想法是将html文档解析为heredoc字符串,因此PHP中的变量将被扩展.
passthrough函数允许在字符串中进行表达式求值和函数以及静态方法调用:
function passthrough($s){return $s;}
$_="passthrough";
Run Code Online (Sandbox Code Playgroud)
在heredoc字符串中解析文档的代码非常简单:
$t=file_get_contents('my_template.html');
eval("\$r=<<<_END_OF_FILE_\n$t\_END_OF_FILE_;\n");
echo $r;
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,它使用eval.
任何人都可以想到一种方法来做这种模板而不使用eval,但没有添加解析器或大量的正则表达式疯狂?
没有编写完整的解析器,任何逃避不属于PHP变量的流浪美元符号的建议?流浪的美元符号问题是否会使这种方法不适合"严重"使用?
这是一些模板化的HTML代码示例.
<script>var _lang = {$_(json_encode($lang))};</script>
<script src='/blah.js'></script>
<link href='/blah.css' type='text/css' rel='stylesheet'>
<form class="inquiry" method="post" action="process.php" onsubmit="return validate(this)">
<div class="filter">
<h2>
{$lang['T_FILTER_TITLE']}
</h2>
<a href='#{$lang['T_FILTER_ALL']}' onclick='applyFilter();'>
{$lang['T_FILTER_ALL']}
</a>
{$filter_html}
</div>
<table class="inventory" id="inventory_table">
{$table_rows}
<tr class="static"><th colspan="{$_($cols+1)}">
{$lang['T_FORM_HELP']}
</th></tr>
{$form_fields}
<tr class="static">
<td id="validation" class="send" colspan="{$cols}"> </td>
<td colspan="1" class="send"><input type="submit" value="{$lang['T_SEND']}" /></td>
</tr>
</table>
</form>
Run Code Online (Sandbox Code Playgroud)
我有一个数据模型,其位域定义如下:
alter table MemberFlags add column title varchar(50) not null default '';
alter table MemberFlags add column value integer( 3) not null default 0;
insert into MemberFlags (title, value) values
("Blacklisted", 1),
("Special Guest", 2),
("Attend Ad-hoc Sessions", 4),
("Attend VIP Sessions", 8),
("Access Facility A", 16),
("Access Facility B", 32)
Run Code Online (Sandbox Code Playgroud)
像这样使用:
alter table Membership add column title varchar(50) not null default '';
alter table Membership add column flags integer( 3) not null default 0;
insert into Membership (title, flags) …Run Code Online (Sandbox Code Playgroud) 我无法理解为什么在严格模式下,delete在非限定标识符上使用时会出现语法错误.
在大多数情况下,它是有道理的...如果你用通常的方式用var关键字声明变量,然后尝试使用delete它们,在非严格模式下它会无声地失败,所以严格模式失败是有意义的在这些情况下有错误.
不过,也有在那里你的情况下无法删除该标识符是合格的:
(function() {
// "use strict";
var obj = Object.create({}, { bloop: { configurable: false } });
delete obj.bloop; // throws TypeError in strict mode, silently fails in non-strict.
console.log('bloop' in obj); // true
}());
Run Code Online (Sandbox Code Playgroud)
严格模式必须在此处执行运行时检查,因为遇到此类型时会引发TypeError.在某些情况下,您可以在非严格模式下成功删除非限定标识符...
// "use strict";
window.bar = 6;
console.log(typeof bar); // number
delete bar; // works in non-strict, syntax error in strict!
console.log(typeof bar); // undefined
Run Code Online (Sandbox Code Playgroud)
事实上,根据我的理解,您是否可以删除内容(在非严格模式下)取决于内部[[Configurable]]属性,并且与限定标识符无关.据我所知,在严格模式下无法删除非全局变量(作为本地VO的属性)是可配置的:
(function() …Run Code Online (Sandbox Code Playgroud) 背景
我正在为度假租赁网站开发一款django应用程序.它将有两种类型的用户,租房者和物业经理.
我希望物业经理能够在django管理员中管理他们的出租物业.但是,他们应该只能管理自己的属性.
我意识到默认的django管理员不支持这个.我想知道添加这个功能会有多麻烦,如果可行的话,处理它的最佳方法是什么.
目标
理想情况下,我认为它的工作方式如下:
auth 已经允许这样的权限:
vacation | rental | Can add rental vacation | rental | Can change rental vacation | rental | Can delete rental
我想将其更改为:
vacation | rental | Can add any rental vacation | rental | Can change any rental vacation | rental | Can delete any rental vacation | rental | Can add own rental vacation | rental | Can change own rental vacation | rental | Can delete own rental
可能解决方案
框架如何决定租赁(或其他)是否属于用户?我想它会检查 …
我试图找出如何使用asp.net mvc实现"插件"框架.我做了一些阅读,发现许多人推荐使用MEF作为asp.net mvc中的插件框架.
链接:http://blog.maartenballiauw.be/post/2009/04/21/ASPNET-MVC-and-the-Managed-Extensibility-Framework-%28MEF%29.aspx
但是,我遇到了一个我无法使用的问题ViewModels和其他基本的mvc组件.我知道现在我有点过头了.我正在寻找教程,书籍和插件模式的例子,但我找不到任何东西.而且,我发现的大部分MEF文档都是我的头脑(codeplex),或者是几年前在.NET 4中发布MEF之前的文档.
任何方向/帮助将不胜感激!!! 我不是在寻找MEF独家信息.我一直专注于MEF,因为它是实际.NET框架的一部分.我不知道它是否可以处理我正在寻找的东西.
您能否就此主题推荐任何中级资源?
我刚刚安装了scrapy,并按照他们的简单dmoz 教程工作.我只是查找了python的基本文件处理,并试图让爬虫从文件中读取URL列表,但是出现了一些错误.这可能是错的,但我试了一下.有人请告诉我一个将URL列表读入scrapy的例子吗?提前致谢.
from scrapy.spider import BaseSpider
class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
f = open("urls.txt")
start_urls = f
def parse(self, response):
filename = response.url.split("/")[-2]
open(filename, 'wb').write(response.body)
Run Code Online (Sandbox Code Playgroud) 依赖于Function.prototype.toString返回将解析为有效javascript函数的字符串(对于用户定义的函数)是否安全?
是否有任何常用的javascript引擎偏离规范,就如何以字符串形式表示函数对象?
我已经看到了这个问题,但我不确定它是否也在问同样的问题.我不在乎所有实现中的格式是否完全相同或者其他什么,我更担心一些缩小的js引擎只是剥离整个函数体...
如何找到与当前运行的脚本关联的脚本元素?我只对文档正文中的脚本感兴趣,而不是在头部(或其他地方).
这是我到目前为止,它似乎工作正常.我有没有想到的任何陷阱?
function getCurrentScriptElement() {
var placeholderId = 'placeholder-' + Math.random(),
script, placeholder;
document.write('<br id="' + placeholderId + '">');
placeholder = document.getElementById(placeholderId);
script = placeholder.previousSibling;
placeholder.parentNode.removeChild(placeholder);
return script;
}
Run Code Online (Sandbox Code Playgroud)
我想到的用例涉及需要在脚本标记出现的文档中的相同位置注入内容的脚本,因此延迟加载不会成为问题.换句话说,我只会在适当的地方调用此函数,它不会作为API或任何东西的一部分公开.
我也知道XHTML 的问题,document.write在这种情况下我并不担心(到目前为止).
我以前的尝试看起来像这样:
function getCurrentScriptElement() {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length - 1];
}
Run Code Online (Sandbox Code Playgroud)
但是,正如我们在这个问题中看到的,如果将另一个脚本注入到文档中,这很容易失败.
我也在WHATWG规范中找到document.currentScript了.目前似乎没有得到广泛支持.有一个有趣的垫片需要另一条路线 ...脚本触发错误,捕获它,检查堆栈跟踪以找到脚本的URL,然后找到具有匹配属性的脚本元素.document.currentScriptsrc
这是一个聪明的解决方案,但它显然无法在IE中运行,如果多个脚本使用相同的URL,它将会中断.
理想情况下,我想找到一个解决方案,它提供与顶级代码示例相同的结果(没有额外要求),但不依赖于document.write.这可能吗?如果没有,假设它正确使用(仅在页面加载期间,而不是XHTML),此代码是否相当安全?
编辑:请参阅此答案以了解另一个可能的用例,以及有关br元素用于占位符的原因的详细信息.
请考虑以下代码:
function f() {
f = eval("" + f);
console.log("Inside a call to f(), f is: \n%s", f);
}
f();
console.log("After a call to f(), f is: \n%s", f);
Run Code Online (Sandbox Code Playgroud)
我期望f在执行期间始终定义.但是,在Chrome和IE中,它是undefined在第一个console.log被调用时,而在Firefox中,它是undefined在第二个console.log被调用时.
为什么f不总是定义?为什么Chrome/IE和Firefox的行为有所不同?
Firefox 26上的输出:
在调用f()时,f是:
Run Code Online (Sandbox Code Playgroud)function f() { f = eval("" + f); console.log("Inside a call to f(), f is: \n%s", f); }在调用f()之后,f是:
Run Code Online (Sandbox Code Playgroud)undefined
Chrome 31和IE 11上的输出:
在调用f()时,f是:
Run Code Online (Sandbox Code Playgroud)undefined在调用f()之后,f是:
Run Code Online (Sandbox Code Playgroud)function f() { f = eval("" + …
javascript ×5
python ×3
django ×2
django-admin ×2
.net ×1
asp.net-mvc ×1
bitflags ×1
c# ×1
constructor ×1
database ×1
dom ×1
ecmascript-5 ×1
eval ×1
function ×1
heredoc ×1
html ×1
iframe ×1
php ×1
safari ×1
scrapy ×1
templates ×1
tostring ×1