javascript - window.open 不再适用于 Chrome/Edge 更新
问题描述
ISSUE: 最新一轮的 Google Chrome 和 MS Edge 更新使我们使用 window.DialogArguments 的一些自定义 Dynamics CRM 代码停止工作,我们无法弄清楚原因。它仍然可以在兼容模式下的 Internet Explorer 中运行。
Dynamics CRM 版本:本地 8.2.9.19
我们有一个调用 javascript 函数 SendEmail() 的功能区按钮,该函数调用带有下拉列表框和按钮的弹出窗口。javascript 有一个覆盖函数,可以用普通的 window.open 替换旧的 window.showModalDialog 函数。问题似乎是它不再传递参数并且窗口甚至不会打开。
// MW 6/4/2019
window.showModalDialog = function (url, arg, feature)
{
var opFeature = feature.split(";");
var featuresArray = new Array()
if (document.all)
{
for (var i = 0; i < opFeature.length - 1; i++)
{
var f = opFeature[i].split("=");
featuresArray[f[0]] = f[1];
}
}
else
{
for (var i = 0; i < opFeature.length - 1; i++)
{
var f = opFeature[i].split(":");
featuresArray[f[0].toString().trim().toLowerCase()] = f[1].toString().trim();
}
}
var h = "200px", w = "400px", l = "100px", t = "100px", r = "yes", c = "yes", s = "no";
if (featuresArray["dialogheight"]) h = featuresArray["dialogheight"];
if (featuresArray["dialogwidth"]) w = featuresArray["dialogwidth"];
if (featuresArray["dialogleft"]) l = featuresArray["dialogleft"];
if (featuresArray["dialogtop"]) t = featuresArray["dialogtop"];
if (featuresArray["resizable"]) r = featuresArray["resizable"];
if (featuresArray["center"]) c = featuresArray["center"];
if (featuresArray["status"]) s = featuresArray["status"];
var modelFeature = "height = " + h + ",width = " + w + ",left=" + l + ",top=" + t + ",model=yes,alwaysRaised=yes" + ",resizable= " + r + ",celter=" + c + ",status=" + s;
var model = window.open(url, "", modelFeature, null);
model.dialogArguments = arg;
}
//Purpose: saves the form and shows html pop up with all the templates of email type
function SendEmail() {
var popup = window.showModalDialog(Xrm.Page.context.getClientUrl() + "/WebResources/cmm_sendemail.htm", this, 'center:yes;unadorned:yes;resizable:1;dialogHeight:60px;dialogwidth:550px;scroll:no;status=no');
}
正在调用的 HTML Web 资源 cmm_sendemail.htm 如下所示。“ var entityName = window.dialogArguments.Xrm.Page.data.entity.getEntityName();” 引用 window.dialogArguments 的行在浏览器控制台中返回为未定义。
<title>Send Email</title>
<style>
body {
background-color: rgb(233, 237, 241);
}
select {
padding:5px;
margin: 0;
-webkit-border-radius:4px;
-moz-border-radius:4px;
border-radius:4px;
-webkit-box-shadow: 0 3px 0 #ccc, 0 -1px #fff inset;
-moz-box-shadow: 0 3px 0 #ccc, 0 -1px #fff inset;
box-shadow: 0 3px 0 #ccc, 0 -1px #fff inset;
background: #f8f8f8;
color:#888;
border:none;
outline:none;
height : 30px;
display: inline-block;
-webkit-appearance:none;
-moz-appearance:none;
cursor:pointer;
}
.myButton {
-moz-box-shadow:inset 0px 1px 3px 0px #91b8b3;
-webkit-box-shadow:inset 0px 1px 3px 0px #91b8b3;
box-shadow:inset 0px 1px 3px 0px #91b8b3;
background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #768d87), color-stop(1, #6c7c7c));
background:-moz-linear-gradient(top, #768d87 5%, #6c7c7c 100%);
background:-webkit-linear-gradient(top, #768d87 5%, #6c7c7c 100%);
background:-o-linear-gradient(top, #768d87 5%, #6c7c7c 100%);
background:-ms-linear-gradient(top, #768d87 5%, #6c7c7c 100%);
background:linear-gradient(to bottom, #768d87 5%, #6c7c7c 100%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#768d87', endColorstr='#6c7c7c',GradientType=0);
background-color:#768d87;
-moz-border-radius:18px;
-webkit-border-radius:18px;
border-radius:18px;
border:1px solid #566963;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-family:Arial;
font-size:15px;
font-weight:bold;
padding:5px 15px;
height: 30px;
text-decoration:none;
text-shadow:0px -1px 0px #2b665e;
}
.myButton:hover {
background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #6c7c7c), color-stop(1, #768d87));
background:-moz-linear-gradient(top, #6c7c7c 5%, #768d87 100%);
background:-webkit-linear-gradient(top, #6c7c7c 5%, #768d87 100%);
background:-o-linear-gradient(top, #6c7c7c 5%, #768d87 100%);
background:-ms-linear-gradient(top, #6c7c7c 5%, #768d87 100%);
background:linear-gradient(to bottom, #6c7c7c 5%, #768d87 100%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#6c7c7c', endColorstr='#768d87',GradientType=0);
background-color:#6c7c7c;
}
.myButton:active {
position:relative;
top:1px;
}
</style>
<script src="cmm_jquery.js" type="text/javascript"></script>
<script src="cmm_json2.js" type="text/javascript"></script>
<script src="cmm_xrmservicelibrary.js" type="text/javascript"></script>
<script type="text/javascript">
function addOptions() {
var entityName = window.dialogArguments.Xrm.Page.data.entity.getEntityName();
//CYB-20160218-ND
//purpose: modified according to entity optionset field
var fetchXml = "<a:ColumnSet>" +
"<a:AllColumns>false</a:AllColumns>" +
"<a:Columns xmlns:b='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>" +
"<b:string>cmm_templatetype</b:string>" +
"<b:string>cmm_documentname</b:string>" +
"<b:string>cmm_name</b:string>" +
"<b:string>cmm_entitydropdown</b:string>" +
"</a:Columns>" +
"</a:ColumnSet>" +
"<a:Criteria>" +
"<a:Conditions />" +
"<a:FilterOperator>And</a:FilterOperator>" +
"<a:Filters>" +
"<a:FilterExpression>" +
"<a:Conditions>" +
"<a:ConditionExpression>" +
"<a:AttributeName>cmm_entitydropdown</a:AttributeName>" +
"<a:Operator>Equal</a:Operator>" +
"<a:Values xmlns:b='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>" +
"<b:anyType i:type='c:string' xmlns:c='http://www.w3.org/2001/XMLSchema'>0</b:anyType>" +
"</a:Values>" +
"</a:ConditionExpression>" +
"<a:ConditionExpression>" +
"<a:AttributeName>cmm_templatetype</a:AttributeName>" +
"<a:Operator>Equal</a:Operator>" +
"<a:Values xmlns:b='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>" +
"<b:anyType i:type='c:string' xmlns:c='http://www.w3.org/2001/XMLSchema'>" + 1 + "</b:anyType>" +
"</a:Values>" +
"</a:ConditionExpression>" +
"</a:Conditions>" +
"<a:FilterOperator>And</a:FilterOperator>" +
"<a:Filters />" +
"</a:FilterExpression>" +
"</a:Filters>" +
"</a:Criteria>" +
"<a:Distinct>false</a:Distinct>" +
"<a:EntityName>cmm_template</a:EntityName>" +
"<a:LinkEntities />" +
"<a:Orders>" +
"<a:OrderExpression>" +
"<a:AttributeName>cmm_name</a:AttributeName>" +
"<a:OrderType>Ascending</a:OrderType>" +
"</a:OrderExpression>" +
"</a:Orders>" +
"<a:PageInfo>" +
"<a:Count>0</a:Count>" +
"<a:PageNumber>0</a:PageNumber>" +
"<a:PagingCookie i:nil='true' />" +
"<a:ReturnTotalRecordCount>false</a:ReturnTotalRecordCount>" +
"</a:PageInfo>" +
"<a:NoLock>false</a:NoLock>";
var retrievedRecords = XrmServiceToolkit.Soap.RetrieveMultiple(fetchXml);
var count = retrievedRecords.length;
var btn = document.getElementById("button");
if (count == 0) {
btn.disabled = true;
}
else {
btn.disabled = false;
}
//CYB-20160218-ND
//purpose: added code for sorting the template list
var index = 0;
while (count != index) {
var x = document.getElementById("templateList");
var option = document.createElement("option");
option.text = retrievedRecords[index].attributes['cmm_name'].value;
option.value = retrievedRecords[index].id;
x.add(option);
index++;
}
}
function sendTemplate(method) {
try {
//debugger;
var selectElement = document.getElementById("templateList");
var templateGuid = selectElement.options[selectElement.selectedIndex].value;
retriveCongiguration(templateGuid, method);
} catch (e) {
alert(e);
}
}
function retriveCongiguration(templateGuid, method) {
var obj = window.dialogArguments;
var entityId = window.dialogArguments.Xrm.Page.data.entity.getId();
var entityName = window.dialogArguments.Xrm.Page.data.entity.getEntityName();
var query = "<a:ColumnSet>" +
"<a:AllColumns>false</a:AllColumns>" +
"<a:Columns xmlns:b='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>" +
"<b:string>cmm_methodname</b:string>" +
"<b:string>cmm_data</b:string>" +
"<b:string>cmm_recordguids</b:string>" +
"<b:string>cmm_error</b:string>" +
"</a:Columns>" +
"</a:ColumnSet>" +
"<a:Criteria>" +
"<a:Conditions />" +
"<a:FilterOperator>And</a:FilterOperator>" +
"<a:Filters>" +
"<a:FilterExpression>" +
"<a:Conditions>" +
"<a:ConditionExpression>" +
"<a:AttributeName>cmm_methodname</a:AttributeName>" +
"<a:Operator>Equal</a:Operator>" +
"<a:Values xmlns:b='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>" +
"<b:anyType i:type='c:string' xmlns:c='http://www.w3.org/2001/XMLSchema'>" + method + "</b:anyType>" +
"</a:Values>" +
"</a:ConditionExpression>" +
"<a:ConditionExpression>" +
"<a:AttributeName>cmm_recordguids</a:AttributeName>" +
"<a:Operator>Equal</a:Operator>" +
"<a:Values xmlns:b='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>" +
"<b:anyType i:type='c:string' xmlns:c='http://www.w3.org/2001/XMLSchema'>" + entityId + "</b:anyType>" +
"</a:Values>" +
"</a:ConditionExpression>" +
"<a:ConditionExpression>" +
"<a:AttributeName>cmm_data</a:AttributeName>" +
"<a:Operator>Equal</a:Operator>" +
"<a:Values xmlns:b='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>" +
"<b:anyType i:type='c:string' xmlns:c='http://www.w3.org/2001/XMLSchema'>" + entityName + "," + templateGuid + "</b:anyType>" +
"</a:Values>" +
"</a:ConditionExpression>" +
"</a:Conditions>" +
"<a:FilterOperator>And</a:FilterOperator>" +
"<a:Filters />" +
"</a:FilterExpression>" +
"</a:Filters>" +
"</a:Criteria>" +
"<a:Distinct>false</a:Distinct>" +
"<a:EntityName>cmm_thirdpartyintegrationlog</a:EntityName>" +
"<a:LinkEntities />" +
"<a:Orders />" +
"<a:PageInfo>" +
"<a:Count>0</a:Count>" +
"<a:PageNumber>0</a:PageNumber>" +
"<a:PagingCookie i:nil='true' />" +
"<a:ReturnTotalRecordCount>false</a:ReturnTotalRecordCount>" +
"</a:PageInfo>" +
"<a:NoLock>false</a:NoLock>";
var retrievedWebService = XrmServiceToolkit.Soap.RetrieveMultiple(query);
//debugger;
if (retrievedWebService.length != 0) {
if (retrievedWebService[0].attributes['cmm_error'] != null) {
alert(retrievedWebService[0].attributes['cmm_error'].value);
window.close();
return;
}
}
var currShipment = XrmServiceToolkit.Soap.Retrieve("cmm_shipment", entityId, ["cmm_returndata"]);
var returnValue = currShipment.attributes.cmm_returndata.value;
window.dialogArguments.Xrm.Utility.openEntityForm("email", returnValue);
window.close();
}
function addOrRemoveRecievers() {
window.dialogArguments.Xrm.Page.data.entity.getEntityName();
}
</script>
<br>
<form>
Select Template : <select id="templateList" style="width: 250px; height: 30px;" onchange="addOrRemoveRecievers">
</select>
<button class="myButton" id="button" style="padding: 5px 15px;" onclick="sendTemplate('send')" type="button">Send</button>
</form>
<br>
<br>
<br>
</body></html>
解决方案
推荐阅读
- python - 由于未安装 Pillow,无法使用 ImageField
- ios - 字符串包含 '\n' 时的字符串 Boundingrect 计算问题
- python - altair 置信区间图
- reactjs - 在 React.JS 中刷新后如何让用户保持登录到 firebase
- list - 排序列表颤动
- reactjs - 如何使用 Yup 验证 material-ui-phone-number
- python-3.x - 如何在 MAC 上监听 Tkinter 应用程序“关于”按钮操作
- android - 来自前台服务的导航深度链接
- java - 在 UML 图中显示不同类型帐户的访问级别
- asp.net - 我可以让应用程序监听多个端口吗?(一公用一私用)