window.opener.focus()不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了window.opener.focus()不起作用相关的知识,希望对你有一定的参考价值。

我似乎无法让这个工作。

响应点击,窗口A打开窗口B(然后具有焦点)。然后,响应点击B,窗口调用window.opener.focus(),但焦点不会回到A.

我发现Chrome有一个奇怪的,奇怪的解决方法(29,可能还有其他)。如果我跑:

window.opener.name = 'somename';
window.open(window.opener.location.href, window.opener.name);
window.opener.focus();

它确实有效(并且没有重新加载窗口A)。但这对Firefox不起作用,无论如何它可能都是侥幸。

我似乎很清楚openerfocus应该做什么,但window.opener.focus()不起作用。我错过了什么?

答案

来自fine manual

发出请求将窗口置于前面。它可能由于用户设置而失败,并且在此方法返回之前不保证窗口位于最前面。

强调我的。调用focus()只是一个请求,浏览器可以自由地忽略你,你通常应该被忽略。如果您需要某些原因导致浏览器忽略您的请求,请考虑在有人打字的时候将焦点切换到一个小窗口,从而考虑可以达到的各种邪恶事物。

如果您需要focus()为您的应用程序工作,那么您需要重新设计您的应用程序,以便它不需要调用focus()

另一答案

我可以看到为什么浏览器/操作系统不允许子窗口接管焦点(滥用权力)。这是一个解决方法:

  1. 在父窗口中,声明“window.external”中的一个函数,该函数将触发javascript“alert()”或“confirm()”。
  2. 从子窗口调用该函数。
  3. 浏览器可能会忽略来自想要控制焦点的子窗口的请求(例如window.opener.focus()),但浏览器应该接受来自父窗口的请求,该窗口会触发alert()或confirm()操作,这需要专注于父窗口。

JS家长:

    var child = window.open('child.html', 'child');
    window.external.comeback = function() 
        var back = confirm('Are you sure you want to comback?');
        if(back) 
            child.close();
         else 
            child.focus();
        
    

JS儿童:

    // assuming you have jQuery
    $('.btn').click() 
        window.opener.external.comeback();  
    ;

- 我在现实世界的应用程序中使用此代码来处理在子窗口中运行的检出请求,我需要优雅地返回到父窗口。

见:SimplifySites.com

另一答案

面向Web或私有内部网?

窗口管理取决于浏览器和操作系统。 HTML和ECMAscript无话可说。

如果这是面向公众的网站,那就不要打扰 - 正如他们所说,“不要破坏网络。”

但我真的很想!

如果这是针对一些严格管理(比如Intranet)的应用程序,那么你需要求助于编写Addons / Extensions。如果您可以将自己限制在一个浏览器和平台上,这肯定会更容易。

编辑:Win32上的Firefox示例...

此解决方案作为Firefox的自定义插件,在内部使用jsctypes加载Win32 DLL。 window_focus() JavaScript函数被公开,它可以满足您的需求。

这个解决方案有3个部分:

  1. 用于加载/绑定Win32 API的特权JavaScript代码
  2. 我们的外部DLL的CPP头文件
  3. 我们的外部DLL的CPP源文件

我在MSVC ++中使用后两个文件和编译的wmctrl.dll构建了一个简单的GUI DLL项目,具体取决于msvcr100.dll,并使用Dependency Walker查找DLL导出的“plain C”符号以供js-ctypes使用。例如:?wmctrl_find_window@@YAKPAD@Z是C ++ api函数的“普通C”符号,称为wmctrl_find_window

需要注意的是,此代码依赖于暂时能够更改需要关注的窗口的标题,以便Win32 API可以检查桌面上的所有窗口以查找正确的Firefox窗口。

您需要访问特权Mozilla平台API,即:Firefox Addon中的JavaScript。

在您的特权JavaScript代码中:

// get API constants (might already be available)
const Cc,Ci,Cu = require("chrome");

// import js-ctypes
var file=null, lib=null, ctypes = ;
Cu.import("resource://gre/modules/ctypes.jsm", ctypes);
var ctypes = ctypes.ctypes;

// build platform specific library path
var filename = ctypes.libraryName("wmctrl"); // automatically adds '.dll'
var comp = "@mozilla.org/file/directory_service;1";
var file = Cc[comp].getService(Ci.nsIProperties).get("CurProcD", Ci.nsIFile);
file.append("browser_code"); // or whereever you put your DLL
file.append(filename);

// get the JavaScript library interface (load the library)
var lib = ctypes.open(file.path);

// wmctrl_find_window: returing unsigned 32bit (long) "window handle"
// takes string "window title".
var find_window = lib.declare(
    "?wmctrl_find_window@@YAKPAD@Z",     /* plain "C" DLL symbol  */
    ctypes.stdcall_abi, ctypes.uint32_t, /* return type: uint32   */
    ctypes.char.ptr);                    /* parameter: string     */

// wmctrl_window_focus: takes unsigned 32bit (long) "window handle".
var window_focus = lib.declare(
    "?wmctrl_window_focus@@YAXK@Z",      /* plain "C" DLL symbol  */
    ctypes.stdcall_abi, ctypes.void_t,   /* return type: void     */
    ctypes.uint32_t);                    /* parameter: uint32     */

wmctrldll.h

#ifdef WMCTRLDLL_EXPORTS
#define WMCTRLDLL_API __declspec(dllexport)
#else
#define WMCTRLDLL_API __declspec(dllimport)
#endif

WMCTRLDLL_API void wmctrl_window_focus (unsigned long wid);
WMCTRLDLL_API unsigned long wmctrl_find_window(char* find_title);

wmctrldll.cpp

typedef struct 
  HWND hWnd;
  char title[255];
 myWinSpec;

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) 
  char String[255];
  myWinSpec* to_find = (myWinSpec*) lParam;

  // not a window
  if (!hWnd) return TRUE;                                   

  // not visible
  if (!IsWindowVisible(hWnd)) return TRUE;

  // no window title                  
  if (!GetWindowTextA(hWnd, (LPSTR)String, 255)) return TRUE;

  // no title match
  if (strcmp(String, to_find->title) != 0) return TRUE;     

  to_find->hWnd = hWnd;
  return FALSE;


WMCTRLDLL_API void wmctrl_window_focus(unsigned long wid) 
  SetForegroundWindow((HWND) wid);


WMCTRLDLL_API unsigned long wmctrl_find_window(char* find_title) 
  myWinSpec to_find;

  sprintf_s(to_find.title, sizeof(to_find.title), "%s", find_title);
  to_find.hWnd = 0;

  EnumWindows(EnumWindowsProc, (LPARAM)&to_find);
  return (unsigned long) to_find.hWnd;

另一答案

解决方法在主窗口中添加了脚本功能:

    function here() 
        alert('Welcome Back')  // seems needed to wake up document
        window.focus()
    

在打开的窗口中调用脚本函数:

    function HomeTab()  
        O = window.opener;
        if (O)
            if (O.closed)   alert('Home page has been closed')
            else    O.here()
        else alert('This tab has no home page')
    

在不同的浏览器中工作方式有所不同有些将使父选项卡闪烁有些标记父选项卡,您必须注意它有些您必须首次单击主选项卡,然后您可以授予它直接转到主选项卡的权限一个确认框。

以上是关于window.opener.focus()不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PHP.INI不起作用

C#DataGridView的行列表头背景色字体色不起作用

关于Animate css不起作用的原因

修改php.ini不起作用是为啥

Vba窗体的keydown怎么不起作用

Angular 的 $http.post 不起作用,它的 $http... 也不起作用,但 jQuerys ajax 起作用。为啥?