通过嵌入以下SWF代码,当在单个页面中运行时,新选项卡会显示所需的URL,顶部会显示一个广告栏。无需用户交互。
<embed width="1" height="1" align="middle"
pluginspage="http://www.macromedia.com/go/getflashplayer"
type="application/x-shockwave-flash" allowscriptaccess="sameDomain"
name="blog" bgcolor="000000" wmode="transparent" quality="high"
src="http://i1177.photobucket.com/albums/x348/hosting504/red.swf"
flashvars="web=www.agitehabbero.com/index.php&creador=supercito">
如果代码嵌入到框架中,则不会创建新选项卡,而是修改框架以添加html页面。
编辑:页面上没有JAVASCRIPT。
SWF文件如何执行此操作? (将内容注入网页)?
答案 0 :(得分:6)
此ActionScript3.0代码将注入一个匿名函数,然后在传递单个参数“hello”时执行它:
ExternalInterface.call("function(msg){ alert(msg); }", "hello");
(此执行方式与此Javascript代码一样:function(msg){ alert(msg); }("hello");
)。
由于您可以注入代码,因此您可以编写代码来操作文档(添加元素,修改样式,更改元素值等)。例如,这个AS3代码:ExternalInterface.call("function(){ document.write(\"Hello, world!\"); }");
将显示“Hello,world!”在HTML页面上。
另外,来自docs:
<param name="allowScriptAccess" value="always" />
flash.system.Security.allowDomain(sourceDomain)
我测试了上述所有内容,它在我的浏览器上运行良好:Google Chrome 19,Internet Explorer 8,Firefox 12。
根据您的要求,文档方面没有javascript:)
答案 1 :(得分:3)
AS中有一个名为ExternalInterface
的课程。它有助于flash与JS通信(调用js函数或JS调用flash函数)。然后抛出DOM,可以将内容添加到页面中。可能就是这样。
答案 2 :(得分:3)
一个例子
AS3
package {
import flash.display.Sprite;
import flash.external.ExternalInterface;
import flash.events.*;
public class MyApp extends Sprite {
private var btn:Sprite;
public function MyApp() {
//add an entry point from js (html page) to swf, so js can call the swfFunc
ExternalInterface.addCallback('swfFunc', swfFunc);
btn = new Sprite();
btn.mouseEnabled = true;
btn.x = 0;
btn.graphics.beginFill(0xFF0000, 0);
btn.graphics.drawRect(0, 0, 300, 50);
btn.graphics.endFill();
btn.addEventListener(MouseEvent.CLICK, jsFunc);
addChild(btn);
}
public function jsFunc(evt:MouseEvent):void {
// call the js function named jsFunc
ExternalInterface.call('jsFunc', 'Test JS');
}
//this method is called from the js
public function swfFunc(text:String):void {
trace(text);
}
}
}
HTML
<object id='MySWF' type='application/x-shockwave-flash' data='MyApp.swf' width='300' height='50'>
<param name='movie' value='MyApp.swf' />
<param name='allowscriptaccess' value='always' />
<param name='swliveconnect' value='true' />
</object>
<div id="container">
A Text
</div>
<button type="button" onclick="swfFunc();">Call SWF</button>
JS
function jsFunc(text) {
document.getElementById('container').innerHTML = text;
}
function swfFunc() {
var swfObj = window['MySWF'] || documment['MySWF'];
swfObj.swfFunc('Test SWF');
}
答案 3 :(得分:2)
知道了!
没有Javascript,就像你说的那样
偷偷摸摸的一段代码,我不完全理解为什么,但设法让它工作。
下载并反编译red.swf,并且有2帧,只有第二帧有以下代码(评论是我的)
/*
flashvars are loaded to the _root as following:
_root.web = www.agitehabbero.com/index.php&creador=supercito
oddly the amperesand (&) gets interpreted too so we also get.
_root.creador=supercito
*/
stop();
var url = _root.web;
if ("supercito" == _root.creador) {//verifies that the url passed has a value pair creador=supercito I guess to avoid it being used for something else?
getURL ("http://supercito.com.ar/g3/web.php?url=" + url, "glu");
/* the getURL calls this site, in a new window (frames are treated as windows by browsers)
somehow flash , as it doesn't find the frame or window, converts it into a pop up */
} else {
getURL ("http://supercito.com.ar/404", "glu");
}
哦,这几乎不是ActionScript 2,看起来像AS1(使用相同的VM)。
为了进一步测试我简化了flash代码并上传到服务器:
stop();
getURL ("http://supercito.com.ar/g3/web.php?url=" + _root.web, _root.marco);
现在在服务器中我们可以使用不同的输入,看看会发生什么。 链接是: http://m0.cl/t/dwit/assets/no-usar/testing-odd.php
(对不起那些杂乱的地址,我正处于其他事情的中间)
如果我们使用框架参数的任何值,http:/ / supercito.com.ar页面加载并使窗口成为弹出窗口,除非我们使用_self。
问题是我无法看到这个新窗口变成弹出窗口的部分,也许它隐藏在它加载的jquery文件中。甘拜下风。甚至与查尔斯核对过。
如果有人有想法,请告诉我,我会尝试
希望这有帮助。
这是我的第一篇帖子:)
修改强>
我上传了一个修改版,以便更好地进行测试
现在我们也可以更改主URL。
stop();
getURL (_root.main + _root.web, _root.marco);
编辑Nº2
它闪光!
使用新的设置,您可以尝试任何URL,只要目标窗口不是_self或_top,它就会变成弹出窗口,事实上,Chrome将其解释为弹出窗口,但IE只读取它是一个_blank窗口
对我来说看起来像个错误。
答案 4 :(得分:1)
有几种方法可以从Flash打开新的浏览器窗口(没有HTML页面的帮助):http://helpx.adobe.com/flash-player/kb/create-pop-browser-windows-flash.html
答案 5 :(得分:1)
不确定这是否可行。
现代浏览器具有相当强大的弹出窗口阻止程序,在大多数情况下,如果没有用户交互,则不允许打开新窗口/选项卡。
即使您设法欺骗一个浏览器,也有可能在不同的浏览器/操作系统中无效。
顺便说一句,如果页面上没有JS并且你无法编辑HTML,你可以使用'伪协议'直接从Flash运行JS:var req:URLRequest = new URLRequest('javascript:void(alert('This is called from Flash'))');
navigateToURL(req);
所以,从理论上讲,你可以将非常复杂的JS'注入'到你的HTML页面上。
答案 6 :(得分:1)
首先,您应该确保使用window.top.document。从那里尝试打开窗口 - 如果您的窗口句柄为null,则打开100%iframe。
/**
* @public
*/
public function JSTest():void {
ExternalInterface.call('eval', [
"window.createFrame = function() {",
"var doc = window.top.document;",
"var ifrm = doc.createElement('IFRAME');",
"ifrm.style.position = 'absolute';",
"ifrm.style.left = '0';",
"ifrm.style.top = '0';",
"ifrm.style.width = '100%';",
"ifrm.style.height = '100%';",
"ifrm.setAttribute('src', 'http://vimeo.com');",
"doc.body.appendChild(ifrm);",
"}",
// try opening window, otherwise, open an iframe
"if (!window.open('http://www.vimeo.com', '_top')) {",
"window.createFrame();",
"}"
].join('\n'));
}