How can I make window.showmodaldialog work in chrome 37? How can I make window.showmodaldialog work in chrome 37? google-chrome google-chrome

How can I make window.showmodaldialog work in chrome 37?


I put the following javascript in the page header and it seems to work. It detects when the browser does not support showModalDialog and attaches a custom method that uses window.open, parses the dialog specs (height, width, scroll, etc.), centers on opener and sets focus back to the window (if focus is lost). Also, it uses the URL as the window name so that a new window is not opened each time. If you are passing window args to the modal you will need to write some additional code to fix that. The popup is not modal but at least you don't have to change a lot of code. Might need some work for your circumstances.

<script type="text/javascript">  // fix for deprecated method in Chrome 37  if (!window.showModalDialog) {     window.showModalDialog = function (arg1, arg2, arg3) {        var w;        var h;        var resizable = "no";        var scroll = "no";        var status = "no";        // get the modal specs        var mdattrs = arg3.split(";");        for (i = 0; i < mdattrs.length; i++) {           var mdattr = mdattrs[i].split(":");           var n = mdattr[0];           var v = mdattr[1];           if (n) { n = n.trim().toLowerCase(); }           if (v) { v = v.trim().toLowerCase(); }           if (n == "dialogheight") {              h = v.replace("px", "");           } else if (n == "dialogwidth") {              w = v.replace("px", "");           } else if (n == "resizable") {              resizable = v;           } else if (n == "scroll") {              scroll = v;           } else if (n == "status") {              status = v;           }        }        var left = window.screenX + (window.outerWidth / 2) - (w / 2);        var top = window.screenY + (window.outerHeight / 2) - (h / 2);        var targetWin = window.open(arg1, arg1, 'toolbar=no, location=no, directories=no, status=' + status + ', menubar=no, scrollbars=' + scroll + ', resizable=' + resizable + ', copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);        targetWin.focus();     };  }</script>


From http://codecorner.galanter.net/2014/09/02/reenable-showmodaldialog-in-chrome/

It's deprecated by design. You can re-enable showModalDialog support, but only temporarily – until May of 2015. Use this time to create alternative solutions.

Here’s how to do it in Chrome for Windows. Open Registry Editor (regedit) and create following key:

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\EnableDeprecatedWebPlatformFeatures

Under the EnableDeprecatedWebPlatformFeatures key create a string value with name 1 and value of ShowModalDialog_EffectiveUntil20150430. To verify that the policy is enabled, visit chrome://policy URL.


UPDATE: If the above didn’t work for you here’s another method to try.

  1. Download Chrome ADM templates from http://www.chromium.org/administrators/policy-templates
  2. Extract and import policy relevant to your locale (e.g. windows\adm\en-US\chrome.adm. You can import either via gpedit.mscor using these utilities on Home editions of windows: http://blogs.technet.com/b/fdcc/archive/2008/05/07/lgpo-utilities.aspx)
  3. Under “Adminstrative Templates” locate Google Chrome template and enable “Enable Deprecated Web Platform Feautes”.
  4. Open the feature and add “ShowModalDialog_EffectiveUntil20150430″ key.


A very good, and working, javascript solution is provided here :https://github.com/niutech/showModalDialog

I personnally used it, works like before for other browser and it creates a new dialog for chrome browser.

Here is an example on how to use it :

function handleReturnValue(returnValue) {    if (returnValue !== undefined) {        // do what you want    }}var myCallback = function (returnValue) { // callback for chrome usage    handleReturnValue(returnValue);};var returnValue = window.showModalDialog('someUrl', 'someDialogTitle', 'someDialogParams', myCallback); handleReturnValue(returnValue); // for other browsers except Chrome