今天在写SharePoint 2013 callout的时候,发现浏览器报了一个错误:calloutManager: launchPoint given is already associated with a callout
代码很简单:
var calloutElement = document.getElementById(divId);
var calloutOptions = new CalloutOptions();
calloutOptions.ID = 'calloutid';
calloutOptions.launchPoint = calloutElement;
calloutOptions.beakOrientation = 'leftRight';
calloutOptions.content = 'This is Callout Description';
calloutOptions.title = 'This is Callout Title';
CalloutManager.createNew(calloutOptions);
错误信息很明显,应该是我重复向一个div绑定callout引起的,最简单的解决办法是try catch捕获这个异常:
try
{
CalloutManager.createNew(calloutOptions);
}
catch(e)
{}
然后我查看了一下CalloutManager的代码,发现可以使用这个方法判断一个div是否已经绑定了一个callout:
var callout = CalloutManager.getFromLaunchPointIfExists(launchPoint);
方法getFromLaunchPointIfExists的参数launchPoint就是div对象,如果返回值callout不为空,就说明这个div已经绑定了callout了。
除此之外,CalloutManager其实已经提供了一个方法处理重复绑定的问题,这个方法是createNewIfNecessary,这个方法会首先使用getFromLaunchPointIfExists方法判断div上是否已经绑定了callout,如果已经绑定,就不会再次绑定了,所以正确的代码是使用createNewIfNecessary而不是createNew:
var calloutElement = document.getElementById(divId);
var calloutOptions = new CalloutOptions();
calloutOptions.ID = 'Calloutid';
calloutOptions.launchPoint = calloutElement;
calloutOptions.beakOrientation = 'leftRight';
calloutOptions.content = 'This is Callout Description';
calloutOptions.title = 'This is Callout Title';
CalloutManager.createNewIfNecessary(calloutOptions);
这样就不会出现异常信息了。