In the battle of electric scooters vs. bikes in Charlotte, one is clearly winning | Charlotte Observer
var userName = checkUserSubscribed('MPPUser');
var signInOrAccountLink = 'Sign In';
var subscribeLink = 'Subscribe';
var label = "My Account";
var signOutLink = '';
if (getSubscribedFlag)
if(userName)
userName = JSON.parse(userName);
subscribeLink = '';
signOutLink = 'Sign Out';
if (userName && userName.firstName && userName.lastName)
label = userName.firstName + ' ' + userName.lastName;
else if (userName && userName.firstName)
label = userName.firstName;
signInOrAccountLink = '' + label + '';
var subscriptionLink = 'Subscriptions';
if (1 === 1)
$(".right.paywall-links").prepend(signInOrAccountLink, " ", subscribeLink);
signInOrAccountLink = signInOrAccountLink.replace("main mh-only-lg", "");
var profileLink = signInOrAccountLink.replace(label, "Profile");
$(".account-popup .content").prepend(profileLink, subscriptionLink);
$(".account-popup .footer").prepend(signOutLink);
if (getSubscribedFlag)
$(".account-popup .user-name").prepend(signInOrAccountLink);
var f = userName.firstName.split('').shift();
var l = userName.lastName.split('').shift();
$(".account-links.mobile .initials").html(f+l);
else
var userIcon = '';
$(".account-links.mobile .initials").html(userIcon);
subscribeLink = subscribeLink.replace("impact mh-only-lg", "");
$(".account-popup .content").append(subscribeLink);
var userName = checkUserSubscribed('MPPUser');
var signInOrAccountLink = 'Sign In';
var subscribeLink = 'Subscribe';
var label = "My Account";
var signOutLink = '';
if (getSubscribedFlag)
if(userName)
userName = JSON.parse(userName);
subscribeLink = '';
signOutLink = 'Sign Out';
if (userName && userName.firstName && userName.lastName)
label = userName.firstName + ' ' + userName.lastName;
else if (userName && userName.firstName)
label = userName.firstName;
signInOrAccountLink = '' + label + '';
var subscriptionLink = 'Subscriptions';
if (1 === 1)
$(".right.paywall-links").prepend(signInOrAccountLink, " ", subscribeLink);
signInOrAccountLink = signInOrAccountLink.replace("main mh-only-lg", "");
var profileLink = signInOrAccountLink.replace(label, "Profile");
$(".account-popup .content").prepend(profileLink, subscriptionLink);
$(".account-popup .footer").prepend(signOutLink);
if (getSubscribedFlag)
$(".account-popup .user-name").prepend(signInOrAccountLink);
var f = userName.firstName.split('').shift();
var l = userName.lastName.split('').shift();
$(".account-links.mobile .initials").html(f+l);
else
var userIcon = '';
$(".account-links.mobile .initials").html(userIcon);
subscribeLink = subscribeLink.replace("impact mh-only-lg", "");
$(".account-popup .content").append(subscribeLink);
Scooters in the fine print: Here’s what you could be charged for.
jQuery(document).ready(function ()
mi.leadAssets.init();
);
Charlotteans seem to prefer scooting to pedaling.
Both dockless bikes and scooters have exploded in popularity in recent months, with riders zipping around uptown, South End and other close-in neighborhoods. But the latest numbers from the pilot program show electric scooter use has quickly outpaced shared bikes, with scooter users riding more and riding farther.
Their soaring popularity has also prompted more calls for regulation and worries about safety, helmet-less riders and pedestrians being bowled over. At least one major employer, Duke Energy, has barred its employees from using scooters during work hours.
“Even though these items can be tempting to use as a fun, fast means of getting from one location to another, there is also a tremendous amount of risk associated with operating them,” said Duke Energy spokesman Neil Nissan. “Whether they’re walking, riding a bike or driving a car, we’ve asked them to be on the lookout for more people using rental bicycles and scooters.”
var mi = mi || ;
mi.calltoActionCtrl = (function ()
var $subscriptionForm = document.querySelector('#story-cta-widget');
var $newsletterForm = document.querySelector('#newsletter-signUpWidget');
if ($newsletterForm != null)
var isNewsletterEnabled = getDataAttribute($newsletterForm, 'isNewsletterEnabled');
if (isNewsletterEnabled === 'true')
var $email = $newsletterForm.querySelector('#s_email_address');
var $submitBtn = $newsletterForm.querySelector('#newsletterSignupSubmit');
// Object that contains key values stored in data-attributes
var config =
newsletterPreferenceListNames: JSON.parse(getDataAttribute($newsletterForm, 'newsletterPreferenceListNames')),
siteName: getDataAttribute($newsletterForm, 'newsletterSiteName'),
newsletterUrl: getDataAttribute($newsletterForm, 'newsletterUrl'),
newsletterSuccess: getDataAttribute($newsletterForm, 'newsletterSuccess'),
;
var newsletterData =
siteName: config.siteName
;
function isEmailValid(email) (([a-zA-Z-0-9]+.)+[a-zA-Z]2,))$/;
return re.test(email);
function getDataAttribute(el, attr)
var dataAttr = 'data-' + attr;
if (el.hasAttribute(dataAttr))
var val = el.getAttribute(dataAttr);
el.removeAttribute(dataAttr);
return val;
function getRandomArbitrary(min, max)
var randomNum = Math.random() * ((max - min) + min);
return Math.round(randomNum);
function removeNode(node)
if (node)
node.parentNode.removeChild(node);
function insertAfterNode(el, node)
if (node)
node.parentNode.insertBefore(el, node.nextSibling);
function insertHeadings(pos)
var $heading = document.createElement('h1');
$heading.classList.add('heading');
$heading.innerHTML = config.newsletterPreferenceListNames[pos].title;
$newsletterForm.insertBefore($heading, $newsletterForm.firstChild);
var $subtitle = document.createElement('p');
$subtitle.classList.add('subtitle');
$subtitle.innerHTML = config.newsletterPreferenceListNames[pos].headline;
insertAfterNode($subtitle, $heading);
function displayRandomNewsletter(num)
if($subscriptionForm)
removeNode($subscriptionForm);
$newsletterForm.classList.remove('hidden');
newsletterData.preferenceListName = config.newsletterPreferenceListNames[num].name;
$newsletterForm.querySelector('#newsletterType').value = config.newsletterPreferenceListNames[num].name;
insertHeadings(num);
function removeRandomCTA()
if (isNewsletterEnabled === 'true')
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length -1 );
if ($subscriptionForm && num === 0)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
displayRandomNewsletter(num )
notifyWidgetSelected($newsletterForm);
else
var num = getRandomArbitrary(0, 1);
if (num === 1)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
removeNode($subscriptionForm);
notifyWidgetSelected($newsletterForm);
if($newsletterForm != null)
$newsletterForm.classList.remove('hidden')
function notifyWidgetSelected(widget)
var newEvent = new CustomEvent('cta_widget', detail: widget);
window.dispatchEvent(newEvent);
function enableSubmitBtn()
$submitBtn.classList.remove('disabled');
$submitBtn.disabled = false;
function disableSubmitBtn()
$submitBtn.classList.add('disabled');
$submitBtn.disabled = true;
function showErrorMsg(node, msg)
var div = document.createElement('div');
div.classList.add('errorText');
div.innerHTML = msg;
insertAfterNode(div, node);
function validateNewsletter()
var errorMsg = $newsletterForm.querySelector('.errorText');
if (errorMsg)
errorMsg.remove();
if ($email.classList.contains('error'))
$email.classList.remove('error');
if (!isEmailValid($email.value))
showErrorMsg($email, "Please insert a valid email address!");
$email.classList.add('error');
disableSubmitBtn();
else
enableSubmitBtn();
;
function submitNewsletter(e)
e.preventDefault();
validateNewsletter();
if ($submitBtn.classList.contains('disabled'))
return false;
grecaptcha.execute();
newsletterData.emailAddress = $email.value;
$newsletterForm.setAttribute('data-json', JSON.stringify(newsletterData));
;
function eventHandlers()
$email.addEventListener('change', function (e)
validateNewsletter();
);
$newsletterForm.addEventListener('submit', function (e)
submitNewsletter(e);
);
$submitBtn.addEventListener('click', function (e)
submitNewsletter(e);
);
function init(isNewsletterEnabled)
/* eslint-disable no-undef */
var isLoggedIn = getSubscribedFlag;
/* eslint-enable no-undef */
if (isLoggedIn)
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length - 1);
displayRandomNewsletter(num);
else
removeRandomCTA();
if (isNewsletterEnabled === true)
eventHandlers();
return
init: init
());
/* function enableSubmitBtn(token)
mi.calltoActionCtrl.sendResponse(token);
*/
jQuery(document).ready(function ()
mi.calltoActionCtrl.init(true);
);
A Charlotte Department of Transportation spokeswoman declined to comment about safety issues and referred comment to the companies. The CDOT representative said no information was available about injuries reported so far from scooter use, though the department encourages riders to wear helmets and carefully plan their routes.
“As more and more people rely on and adapt to scooter sharing, we believe that along with proactive education, safe riding and responsible use will ultimately become a natural habit,” said Mary Caroline Pruitt, a spokeswoman for Lime. She pointed out that the company instructs riders to wear helmets with notices through the app and reminders on the scooter itself.
“Safety is our number one priority, and Lime urges riders to always put the safety of others and themselves before anything else when operating any of our vehicles.”
Both the bikes and scooters are operating as part of a pilot program under an agreement with the city that ends this fall. Last November, 2,000 dockless bikes from four companies — Ofo, Lime, Mobike and Spin — hit the Charlotte streets.
One of the companies, Ofo, pulled out of Charlotte in July and several other U.S. cities this year after the company said it had “begun to re-evaluate markets that present obstacles,” without citing specific reasons.
The scooter companies, Bird and Lime, are each allowed to operate up to 400 scooters in Charlotte, under a pilot program that started in late May.
In just a few months, the number of scooter rides has outpaced the number of bike rides. While bikes require pedaling, balancing and, in the summer, sweating, electric scooters propel riders at faster speeds with the flick of a thumb lever.
As of July, people in Charlotte had ridden electric scooters more than 174,000 times, according to the Charlotte Department of Transportation, compared to approximately 173,264 dockless bike rides. That’s despite the bikes having been available in Charlotte for nine months versus less than three for the scooters and there being almost twice as many bikes available.
The data for July, the most recent month available, show bike users took 27,453 trips and rode 19,430 miles.
Electric scooters, on the other hand, accounted for 100,273 trips and a whopping 139,215 miles in the same month.
The average scooter user rode 1.42 miles and spent 13 minutes per ride, according to CDOT. Bikes were ridden an average of about 3/4 miles, with average trip lengths of nine minutes.
Unlike previous bike-sharing options, users leave dockless bikes and scooters wherever they want when their ride is done, and the next user finds their ride with a GPS-enabled app. Riders rent them with an app on their phone.
The bikes and scooters typically cost $1 to unlock, and additional charges are based on the time rented, with scooters costing 15 cents per minute and the bikes costing $1 per hour or 30 minutes.
After the pilot program ends, Charlotte City Council could consider regulations ranging from banning the companies, requiring them to pay permitting fees, limiting the number of operators allowed in the city or restricting where riders can go.
Despite their popularity, the companies have faced questions about regulation and safety.
Riders often don’t wear helmets and are sometimes on sidewalks or in traffic. The electric scooters can top 20 mph going downhill. Bicycles are sometimes left blocking sidewalks, in private yards or even dumped in creeks and ponds.
The scooter companies prompted even more regulatory questions when they started leaving their dockless electric vehicles around the city without permission. Initially, Charlotte officials told them they had to remove their scooters or face confiscation. But the city agreed in the pilot program to see how they would work.
Council member Larken Egleston said Monday that he’s worried about safety. He said he saw a couple riding an electric scooter on Interstate 277 this weekend.
“Someone will die on an e-scooter before the end of this calendar year,” he predicted. “We’ve got to have some rules in place.”
Bird didn’t respond to messages seeking more information Tuesday.
Scooters in the fine print: Here’s what you could be charged for.
jQuery(document).ready(function ()
mi.leadAssets.init();
);
Charlotteans seem to prefer scooting to pedaling.
Both dockless bikes and scooters have exploded in popularity in recent months, with riders zipping around uptown, South End and other close-in neighborhoods. But the latest numbers from the pilot program show electric scooter use has quickly outpaced shared bikes, with scooter users riding more and riding farther.
Their soaring popularity has also prompted more calls for regulation and worries about safety, helmet-less riders and pedestrians being bowled over. At least one major employer, Duke Energy, has barred its employees from using scooters during work hours.
“Even though these items can be tempting to use as a fun, fast means of getting from one location to another, there is also a tremendous amount of risk associated with operating them,” said Duke Energy spokesman Neil Nissan. “Whether they’re walking, riding a bike or driving a car, we’ve asked them to be on the lookout for more people using rental bicycles and scooters.”
var mi = mi || ;
mi.calltoActionCtrl = (function ()
var $subscriptionForm = document.querySelector('#story-cta-widget');
var $newsletterForm = document.querySelector('#newsletter-signUpWidget');
if ($newsletterForm != null)
var isNewsletterEnabled = getDataAttribute($newsletterForm, 'isNewsletterEnabled');
if (isNewsletterEnabled === 'true')
var $email = $newsletterForm.querySelector('#s_email_address');
var $submitBtn = $newsletterForm.querySelector('#newsletterSignupSubmit');
// Object that contains key values stored in data-attributes
var config =
newsletterPreferenceListNames: JSON.parse(getDataAttribute($newsletterForm, 'newsletterPreferenceListNames')),
siteName: getDataAttribute($newsletterForm, 'newsletterSiteName'),
newsletterUrl: getDataAttribute($newsletterForm, 'newsletterUrl'),
newsletterSuccess: getDataAttribute($newsletterForm, 'newsletterSuccess'),
;
var newsletterData =
siteName: config.siteName
;
function isEmailValid(email) (([a-zA-Z-0-9]+.)+[a-zA-Z]2,))$/;
return re.test(email);
function getDataAttribute(el, attr)
var dataAttr = 'data-' + attr;
if (el.hasAttribute(dataAttr))
var val = el.getAttribute(dataAttr);
el.removeAttribute(dataAttr);
return val;
function getRandomArbitrary(min, max)
var randomNum = Math.random() * ((max - min) + min);
return Math.round(randomNum);
function removeNode(node)
if (node)
node.parentNode.removeChild(node);
function insertAfterNode(el, node)
if (node)
node.parentNode.insertBefore(el, node.nextSibling);
function insertHeadings(pos)
var $heading = document.createElement('h1');
$heading.classList.add('heading');
$heading.innerHTML = config.newsletterPreferenceListNames[pos].title;
$newsletterForm.insertBefore($heading, $newsletterForm.firstChild);
var $subtitle = document.createElement('p');
$subtitle.classList.add('subtitle');
$subtitle.innerHTML = config.newsletterPreferenceListNames[pos].headline;
insertAfterNode($subtitle, $heading);
function displayRandomNewsletter(num)
if($subscriptionForm)
removeNode($subscriptionForm);
$newsletterForm.classList.remove('hidden');
newsletterData.preferenceListName = config.newsletterPreferenceListNames[num].name;
$newsletterForm.querySelector('#newsletterType').value = config.newsletterPreferenceListNames[num].name;
insertHeadings(num);
function removeRandomCTA()
if (isNewsletterEnabled === 'true')
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length -1 );
if ($subscriptionForm && num === 0)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
displayRandomNewsletter(num )
notifyWidgetSelected($newsletterForm);
else
var num = getRandomArbitrary(0, 1);
if (num === 1)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
removeNode($subscriptionForm);
notifyWidgetSelected($newsletterForm);
if($newsletterForm != null)
$newsletterForm.classList.remove('hidden')
function notifyWidgetSelected(widget)
var newEvent = new CustomEvent('cta_widget', detail: widget);
window.dispatchEvent(newEvent);
function enableSubmitBtn()
$submitBtn.classList.remove('disabled');
$submitBtn.disabled = false;
function disableSubmitBtn()
$submitBtn.classList.add('disabled');
$submitBtn.disabled = true;
function showErrorMsg(node, msg)
var div = document.createElement('div');
div.classList.add('errorText');
div.innerHTML = msg;
insertAfterNode(div, node);
function validateNewsletter()
var errorMsg = $newsletterForm.querySelector('.errorText');
if (errorMsg)
errorMsg.remove();
if ($email.classList.contains('error'))
$email.classList.remove('error');
if (!isEmailValid($email.value))
showErrorMsg($email, "Please insert a valid email address!");
$email.classList.add('error');
disableSubmitBtn();
else
enableSubmitBtn();
;
function submitNewsletter(e)
e.preventDefault();
validateNewsletter();
if ($submitBtn.classList.contains('disabled'))
return false;
grecaptcha.execute();
newsletterData.emailAddress = $email.value;
$newsletterForm.setAttribute('data-json', JSON.stringify(newsletterData));
;
function eventHandlers()
$email.addEventListener('change', function (e)
validateNewsletter();
);
$newsletterForm.addEventListener('submit', function (e)
submitNewsletter(e);
);
$submitBtn.addEventListener('click', function (e)
submitNewsletter(e);
);
function init(isNewsletterEnabled)
/* eslint-disable no-undef */
var isLoggedIn = getSubscribedFlag;
/* eslint-enable no-undef */
if (isLoggedIn)
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length - 1);
displayRandomNewsletter(num);
else
removeRandomCTA();
if (isNewsletterEnabled === true)
eventHandlers();
return
init: init
());
/* function enableSubmitBtn(token)
mi.calltoActionCtrl.sendResponse(token);
*/
jQuery(document).ready(function ()
mi.calltoActionCtrl.init(true);
);
A Charlotte Department of Transportation spokeswoman declined to comment about safety issues and referred comment to the companies. The CDOT representative said no information was available about injuries reported so far from scooter use, though the department encourages riders to wear helmets and carefully plan their routes.
“As more and more people rely on and adapt to scooter sharing, we believe that along with proactive education, safe riding and responsible use will ultimately become a natural habit,” said Mary Caroline Pruitt, a spokeswoman for Lime. She pointed out that the company instructs riders to wear helmets with notices through the app and reminders on the scooter itself.
“Safety is our number one priority, and Lime urges riders to always put the safety of others and themselves before anything else when operating any of our vehicles.”
Both the bikes and scooters are operating as part of a pilot program under an agreement with the city that ends this fall. Last November, 2,000 dockless bikes from four companies — Ofo, Lime, Mobike and Spin — hit the Charlotte streets.
One of the companies, Ofo, pulled out of Charlotte in July and several other U.S. cities this year after the company said it had “begun to re-evaluate markets that present obstacles,” without citing specific reasons.
The scooter companies, Bird and Lime, are each allowed to operate up to 400 scooters in Charlotte, under a pilot program that started in late May.
In just a few months, the number of scooter rides has outpaced the number of bike rides. While bikes require pedaling, balancing and, in the summer, sweating, electric scooters propel riders at faster speeds with the flick of a thumb lever.
As of July, people in Charlotte had ridden electric scooters more than 174,000 times, according to the Charlotte Department of Transportation, compared to approximately 173,264 dockless bike rides. That’s despite the bikes having been available in Charlotte for nine months versus less than three for the scooters and there being almost twice as many bikes available.
The data for July, the most recent month available, show bike users took 27,453 trips and rode 19,430 miles.
Electric scooters, on the other hand, accounted for 100,273 trips and a whopping 139,215 miles in the same month.
The average scooter user rode 1.42 miles and spent 13 minutes per ride, according to CDOT. Bikes were ridden an average of about 3/4 miles, with average trip lengths of nine minutes.
Unlike previous bike-sharing options, users leave dockless bikes and scooters wherever they want when their ride is done, and the next user finds their ride with a GPS-enabled app. Riders rent them with an app on their phone.
The bikes and scooters typically cost $1 to unlock, and additional charges are based on the time rented, with scooters costing 15 cents per minute and the bikes costing $1 per hour or 30 minutes.
After the pilot program ends, Charlotte City Council could consider regulations ranging from banning the companies, requiring them to pay permitting fees, limiting the number of operators allowed in the city or restricting where riders can go.
Despite their popularity, the companies have faced questions about regulation and safety.
Riders often don’t wear helmets and are sometimes on sidewalks or in traffic. The electric scooters can top 20 mph going downhill. Bicycles are sometimes left blocking sidewalks, in private yards or even dumped in creeks and ponds.
The scooter companies prompted even more regulatory questions when they started leaving their dockless electric vehicles around the city without permission. Initially, Charlotte officials told them they had to remove their scooters or face confiscation. But the city agreed in the pilot program to see how they would work.
Council member Larken Egleston said Monday that he’s worried about safety. He said he saw a couple riding an electric scooter on Interstate 277 this weekend.
“Someone will die on an e-scooter before the end of this calendar year,” he predicted. “We’ve got to have some rules in place.”
Bird didn’t respond to messages seeking more information Tuesday.
Scooters in the fine print: Here’s what you could be charged for.
Scooters in the fine print: Here’s what you could be charged for.
Scooters in the fine print: Here’s what you could be charged for.
Scooters in the fine print: Here’s what you could be charged for.
Charlotteans seem to prefer scooting to pedaling.
Both dockless bikes and scooters have exploded in popularity in recent months, with riders zipping around uptown, South End and other close-in neighborhoods. But the latest numbers from the pilot program show electric scooter use has quickly outpaced shared bikes, with scooter users riding more and riding farther.
Their soaring popularity has also prompted more calls for regulation and worries about safety, helmet-less riders and pedestrians being bowled over. At least one major employer, Duke Energy, has barred its employees from using scooters during work hours.
“Even though these items can be tempting to use as a fun, fast means of getting from one location to another, there is also a tremendous amount of risk associated with operating them,” said Duke Energy spokesman Neil Nissan. “Whether they’re walking, riding a bike or driving a car, we’ve asked them to be on the lookout for more people using rental bicycles and scooters.”
var mi = mi || ;
mi.calltoActionCtrl = (function ()
var $subscriptionForm = document.querySelector('#story-cta-widget');
var $newsletterForm = document.querySelector('#newsletter-signUpWidget');
if ($newsletterForm != null)
var isNewsletterEnabled = getDataAttribute($newsletterForm, 'isNewsletterEnabled');
if (isNewsletterEnabled === 'true')
var $email = $newsletterForm.querySelector('#s_email_address');
var $submitBtn = $newsletterForm.querySelector('#newsletterSignupSubmit');
// Object that contains key values stored in data-attributes
var config =
newsletterPreferenceListNames: JSON.parse(getDataAttribute($newsletterForm, 'newsletterPreferenceListNames')),
siteName: getDataAttribute($newsletterForm, 'newsletterSiteName'),
newsletterUrl: getDataAttribute($newsletterForm, 'newsletterUrl'),
newsletterSuccess: getDataAttribute($newsletterForm, 'newsletterSuccess'),
;
var newsletterData =
siteName: config.siteName
;
function isEmailValid(email) (([a-zA-Z-0-9]+.)+[a-zA-Z]2,))$/;
return re.test(email);
function getDataAttribute(el, attr)
var dataAttr = 'data-' + attr;
if (el.hasAttribute(dataAttr))
var val = el.getAttribute(dataAttr);
el.removeAttribute(dataAttr);
return val;
function getRandomArbitrary(min, max)
var randomNum = Math.random() * ((max - min) + min);
return Math.round(randomNum);
function removeNode(node)
if (node)
node.parentNode.removeChild(node);
function insertAfterNode(el, node)
if (node)
node.parentNode.insertBefore(el, node.nextSibling);
function insertHeadings(pos)
var $heading = document.createElement('h1');
$heading.classList.add('heading');
$heading.innerHTML = config.newsletterPreferenceListNames[pos].title;
$newsletterForm.insertBefore($heading, $newsletterForm.firstChild);
var $subtitle = document.createElement('p');
$subtitle.classList.add('subtitle');
$subtitle.innerHTML = config.newsletterPreferenceListNames[pos].headline;
insertAfterNode($subtitle, $heading);
function displayRandomNewsletter(num)
if($subscriptionForm)
removeNode($subscriptionForm);
$newsletterForm.classList.remove('hidden');
newsletterData.preferenceListName = config.newsletterPreferenceListNames[num].name;
$newsletterForm.querySelector('#newsletterType').value = config.newsletterPreferenceListNames[num].name;
insertHeadings(num);
function removeRandomCTA()
if (isNewsletterEnabled === 'true')
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length -1 );
if ($subscriptionForm && num === 0)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
displayRandomNewsletter(num )
notifyWidgetSelected($newsletterForm);
else
var num = getRandomArbitrary(0, 1);
if (num === 1)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
removeNode($subscriptionForm);
notifyWidgetSelected($newsletterForm);
if($newsletterForm != null)
$newsletterForm.classList.remove('hidden')
function notifyWidgetSelected(widget)
var newEvent = new CustomEvent('cta_widget', detail: widget);
window.dispatchEvent(newEvent);
function enableSubmitBtn()
$submitBtn.classList.remove('disabled');
$submitBtn.disabled = false;
function disableSubmitBtn()
$submitBtn.classList.add('disabled');
$submitBtn.disabled = true;
function showErrorMsg(node, msg)
var div = document.createElement('div');
div.classList.add('errorText');
div.innerHTML = msg;
insertAfterNode(div, node);
function validateNewsletter()
var errorMsg = $newsletterForm.querySelector('.errorText');
if (errorMsg)
errorMsg.remove();
if ($email.classList.contains('error'))
$email.classList.remove('error');
if (!isEmailValid($email.value))
showErrorMsg($email, "Please insert a valid email address!");
$email.classList.add('error');
disableSubmitBtn();
else
enableSubmitBtn();
;
function submitNewsletter(e)
e.preventDefault();
validateNewsletter();
if ($submitBtn.classList.contains('disabled'))
return false;
grecaptcha.execute();
newsletterData.emailAddress = $email.value;
$newsletterForm.setAttribute('data-json', JSON.stringify(newsletterData));
;
function eventHandlers()
$email.addEventListener('change', function (e)
validateNewsletter();
);
$newsletterForm.addEventListener('submit', function (e)
submitNewsletter(e);
);
$submitBtn.addEventListener('click', function (e)
submitNewsletter(e);
);
function init(isNewsletterEnabled)
/* eslint-disable no-undef */
var isLoggedIn = getSubscribedFlag;
/* eslint-enable no-undef */
if (isLoggedIn)
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length - 1);
displayRandomNewsletter(num);
else
removeRandomCTA();
if (isNewsletterEnabled === true)
eventHandlers();
return
init: init
());
/* function enableSubmitBtn(token)
mi.calltoActionCtrl.sendResponse(token);
*/
jQuery(document).ready(function ()
mi.calltoActionCtrl.init(true);
);
A Charlotte Department of Transportation spokeswoman declined to comment about safety issues and referred comment to the companies. The CDOT representative said no information was available about injuries reported so far from scooter use, though the department encourages riders to wear helmets and carefully plan their routes.
“As more and more people rely on and adapt to scooter sharing, we believe that along with proactive education, safe riding and responsible use will ultimately become a natural habit,” said Mary Caroline Pruitt, a spokeswoman for Lime. She pointed out that the company instructs riders to wear helmets with notices through the app and reminders on the scooter itself.
“Safety is our number one priority, and Lime urges riders to always put the safety of others and themselves before anything else when operating any of our vehicles.”
Both the bikes and scooters are operating as part of a pilot program under an agreement with the city that ends this fall. Last November, 2,000 dockless bikes from four companies — Ofo, Lime, Mobike and Spin — hit the Charlotte streets.
One of the companies, Ofo, pulled out of Charlotte in July and several other U.S. cities this year after the company said it had “begun to re-evaluate markets that present obstacles,” without citing specific reasons.
The scooter companies, Bird and Lime, are each allowed to operate up to 400 scooters in Charlotte, under a pilot program that started in late May.
In just a few months, the number of scooter rides has outpaced the number of bike rides. While bikes require pedaling, balancing and, in the summer, sweating, electric scooters propel riders at faster speeds with the flick of a thumb lever.
As of July, people in Charlotte had ridden electric scooters more than 174,000 times, according to the Charlotte Department of Transportation, compared to approximately 173,264 dockless bike rides. That’s despite the bikes having been available in Charlotte for nine months versus less than three for the scooters and there being almost twice as many bikes available.
The data for July, the most recent month available, show bike users took 27,453 trips and rode 19,430 miles.
Electric scooters, on the other hand, accounted for 100,273 trips and a whopping 139,215 miles in the same month.
The average scooter user rode 1.42 miles and spent 13 minutes per ride, according to CDOT. Bikes were ridden an average of about 3/4 miles, with average trip lengths of nine minutes.
Unlike previous bike-sharing options, users leave dockless bikes and scooters wherever they want when their ride is done, and the next user finds their ride with a GPS-enabled app. Riders rent them with an app on their phone.
The bikes and scooters typically cost $1 to unlock, and additional charges are based on the time rented, with scooters costing 15 cents per minute and the bikes costing $1 per hour or 30 minutes.
After the pilot program ends, Charlotte City Council could consider regulations ranging from banning the companies, requiring them to pay permitting fees, limiting the number of operators allowed in the city or restricting where riders can go.
Despite their popularity, the companies have faced questions about regulation and safety.
Riders often don’t wear helmets and are sometimes on sidewalks or in traffic. The electric scooters can top 20 mph going downhill. Bicycles are sometimes left blocking sidewalks, in private yards or even dumped in creeks and ponds.
The scooter companies prompted even more regulatory questions when they started leaving their dockless electric vehicles around the city without permission. Initially, Charlotte officials told them they had to remove their scooters or face confiscation. But the city agreed in the pilot program to see how they would work.
Council member Larken Egleston said Monday that he’s worried about safety. He said he saw a couple riding an electric scooter on Interstate 277 this weekend.
“Someone will die on an e-scooter before the end of this calendar year,” he predicted. “We’ve got to have some rules in place.”
Bird didn’t respond to messages seeking more information Tuesday.
Charlotteans seem to prefer scooting to pedaling.
Both dockless bikes and scooters have exploded in popularity in recent months, with riders zipping around uptown, South End and other close-in neighborhoods. But the latest numbers from the pilot program show electric scooter use has quickly outpaced shared bikes, with scooter users riding more and riding farther.
Their soaring popularity has also prompted more calls for regulation and worries about safety, helmet-less riders and pedestrians being bowled over. At least one major employer, Duke Energy, has barred its employees from using scooters during work hours.
“Even though these items can be tempting to use as a fun, fast means of getting from one location to another, there is also a tremendous amount of risk associated with operating them,” said Duke Energy spokesman Neil Nissan. “Whether they’re walking, riding a bike or driving a car, we’ve asked them to be on the lookout for more people using rental bicycles and scooters.”
var mi = mi || ;
mi.calltoActionCtrl = (function ()
var $subscriptionForm = document.querySelector('#story-cta-widget');
var $newsletterForm = document.querySelector('#newsletter-signUpWidget');
if ($newsletterForm != null)
var isNewsletterEnabled = getDataAttribute($newsletterForm, 'isNewsletterEnabled');
if (isNewsletterEnabled === 'true')
var $email = $newsletterForm.querySelector('#s_email_address');
var $submitBtn = $newsletterForm.querySelector('#newsletterSignupSubmit');
// Object that contains key values stored in data-attributes
var config =
newsletterPreferenceListNames: JSON.parse(getDataAttribute($newsletterForm, 'newsletterPreferenceListNames')),
siteName: getDataAttribute($newsletterForm, 'newsletterSiteName'),
newsletterUrl: getDataAttribute($newsletterForm, 'newsletterUrl'),
newsletterSuccess: getDataAttribute($newsletterForm, 'newsletterSuccess'),
;
var newsletterData =
siteName: config.siteName
;
function isEmailValid(email) (([a-zA-Z-0-9]+.)+[a-zA-Z]2,))$/;
return re.test(email);
function getDataAttribute(el, attr)
var dataAttr = 'data-' + attr;
if (el.hasAttribute(dataAttr))
var val = el.getAttribute(dataAttr);
el.removeAttribute(dataAttr);
return val;
function getRandomArbitrary(min, max)
var randomNum = Math.random() * ((max - min) + min);
return Math.round(randomNum);
function removeNode(node)
if (node)
node.parentNode.removeChild(node);
function insertAfterNode(el, node)
if (node)
node.parentNode.insertBefore(el, node.nextSibling);
function insertHeadings(pos)
var $heading = document.createElement('h1');
$heading.classList.add('heading');
$heading.innerHTML = config.newsletterPreferenceListNames[pos].title;
$newsletterForm.insertBefore($heading, $newsletterForm.firstChild);
var $subtitle = document.createElement('p');
$subtitle.classList.add('subtitle');
$subtitle.innerHTML = config.newsletterPreferenceListNames[pos].headline;
insertAfterNode($subtitle, $heading);
function displayRandomNewsletter(num)
if($subscriptionForm)
removeNode($subscriptionForm);
$newsletterForm.classList.remove('hidden');
newsletterData.preferenceListName = config.newsletterPreferenceListNames[num].name;
$newsletterForm.querySelector('#newsletterType').value = config.newsletterPreferenceListNames[num].name;
insertHeadings(num);
function removeRandomCTA()
if (isNewsletterEnabled === 'true')
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length -1 );
if ($subscriptionForm && num === 0)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
displayRandomNewsletter(num )
notifyWidgetSelected($newsletterForm);
else
var num = getRandomArbitrary(0, 1);
if (num === 1)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
removeNode($subscriptionForm);
notifyWidgetSelected($newsletterForm);
if($newsletterForm != null)
$newsletterForm.classList.remove('hidden')
function notifyWidgetSelected(widget)
var newEvent = new CustomEvent('cta_widget', detail: widget);
window.dispatchEvent(newEvent);
function enableSubmitBtn()
$submitBtn.classList.remove('disabled');
$submitBtn.disabled = false;
function disableSubmitBtn()
$submitBtn.classList.add('disabled');
$submitBtn.disabled = true;
function showErrorMsg(node, msg)
var div = document.createElement('div');
div.classList.add('errorText');
div.innerHTML = msg;
insertAfterNode(div, node);
function validateNewsletter()
var errorMsg = $newsletterForm.querySelector('.errorText');
if (errorMsg)
errorMsg.remove();
if ($email.classList.contains('error'))
$email.classList.remove('error');
if (!isEmailValid($email.value))
showErrorMsg($email, "Please insert a valid email address!");
$email.classList.add('error');
disableSubmitBtn();
else
enableSubmitBtn();
;
function submitNewsletter(e)
e.preventDefault();
validateNewsletter();
if ($submitBtn.classList.contains('disabled'))
return false;
grecaptcha.execute();
newsletterData.emailAddress = $email.value;
$newsletterForm.setAttribute('data-json', JSON.stringify(newsletterData));
;
function eventHandlers()
$email.addEventListener('change', function (e)
validateNewsletter();
);
$newsletterForm.addEventListener('submit', function (e)
submitNewsletter(e);
);
$submitBtn.addEventListener('click', function (e)
submitNewsletter(e);
);
function init(isNewsletterEnabled)
/* eslint-disable no-undef */
var isLoggedIn = getSubscribedFlag;
/* eslint-enable no-undef */
if (isLoggedIn)
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length - 1);
displayRandomNewsletter(num);
else
removeRandomCTA();
if (isNewsletterEnabled === true)
eventHandlers();
return
init: init
());
/* function enableSubmitBtn(token)
mi.calltoActionCtrl.sendResponse(token);
*/
jQuery(document).ready(function ()
mi.calltoActionCtrl.init(true);
);
A Charlotte Department of Transportation spokeswoman declined to comment about safety issues and referred comment to the companies. The CDOT representative said no information was available about injuries reported so far from scooter use, though the department encourages riders to wear helmets and carefully plan their routes.
“As more and more people rely on and adapt to scooter sharing, we believe that along with proactive education, safe riding and responsible use will ultimately become a natural habit,” said Mary Caroline Pruitt, a spokeswoman for Lime. She pointed out that the company instructs riders to wear helmets with notices through the app and reminders on the scooter itself.
“Safety is our number one priority, and Lime urges riders to always put the safety of others and themselves before anything else when operating any of our vehicles.”
Both the bikes and scooters are operating as part of a pilot program under an agreement with the city that ends this fall. Last November, 2,000 dockless bikes from four companies — Ofo, Lime, Mobike and Spin — hit the Charlotte streets.
One of the companies, Ofo, pulled out of Charlotte in July and several other U.S. cities this year after the company said it had “begun to re-evaluate markets that present obstacles,” without citing specific reasons.
The scooter companies, Bird and Lime, are each allowed to operate up to 400 scooters in Charlotte, under a pilot program that started in late May.
In just a few months, the number of scooter rides has outpaced the number of bike rides. While bikes require pedaling, balancing and, in the summer, sweating, electric scooters propel riders at faster speeds with the flick of a thumb lever.
As of July, people in Charlotte had ridden electric scooters more than 174,000 times, according to the Charlotte Department of Transportation, compared to approximately 173,264 dockless bike rides. That’s despite the bikes having been available in Charlotte for nine months versus less than three for the scooters and there being almost twice as many bikes available.
The data for July, the most recent month available, show bike users took 27,453 trips and rode 19,430 miles.
Electric scooters, on the other hand, accounted for 100,273 trips and a whopping 139,215 miles in the same month.
The average scooter user rode 1.42 miles and spent 13 minutes per ride, according to CDOT. Bikes were ridden an average of about 3/4 miles, with average trip lengths of nine minutes.
Unlike previous bike-sharing options, users leave dockless bikes and scooters wherever they want when their ride is done, and the next user finds their ride with a GPS-enabled app. Riders rent them with an app on their phone.
The bikes and scooters typically cost $1 to unlock, and additional charges are based on the time rented, with scooters costing 15 cents per minute and the bikes costing $1 per hour or 30 minutes.
After the pilot program ends, Charlotte City Council could consider regulations ranging from banning the companies, requiring them to pay permitting fees, limiting the number of operators allowed in the city or restricting where riders can go.
Despite their popularity, the companies have faced questions about regulation and safety.
Riders often don’t wear helmets and are sometimes on sidewalks or in traffic. The electric scooters can top 20 mph going downhill. Bicycles are sometimes left blocking sidewalks, in private yards or even dumped in creeks and ponds.
The scooter companies prompted even more regulatory questions when they started leaving their dockless electric vehicles around the city without permission. Initially, Charlotte officials told them they had to remove their scooters or face confiscation. But the city agreed in the pilot program to see how they would work.
Council member Larken Egleston said Monday that he’s worried about safety. He said he saw a couple riding an electric scooter on Interstate 277 this weekend.
“Someone will die on an e-scooter before the end of this calendar year,” he predicted. “We’ve got to have some rules in place.”
Bird didn’t respond to messages seeking more information Tuesday.
Charlotteans seem to prefer scooting to pedaling.
Both dockless bikes and scooters have exploded in popularity in recent months, with riders zipping around uptown, South End and other close-in neighborhoods. But the latest numbers from the pilot program show electric scooter use has quickly outpaced shared bikes, with scooter users riding more and riding farther.
Their soaring popularity has also prompted more calls for regulation and worries about safety, helmet-less riders and pedestrians being bowled over. At least one major employer, Duke Energy, has barred its employees from using scooters during work hours.
“Even though these items can be tempting to use as a fun, fast means of getting from one location to another, there is also a tremendous amount of risk associated with operating them,” said Duke Energy spokesman Neil Nissan. “Whether they’re walking, riding a bike or driving a car, we’ve asked them to be on the lookout for more people using rental bicycles and scooters.”
var mi = mi || ;
mi.calltoActionCtrl = (function ()
var $subscriptionForm = document.querySelector('#story-cta-widget');
var $newsletterForm = document.querySelector('#newsletter-signUpWidget');
if ($newsletterForm != null)
var isNewsletterEnabled = getDataAttribute($newsletterForm, 'isNewsletterEnabled');
if (isNewsletterEnabled === 'true')
var $email = $newsletterForm.querySelector('#s_email_address');
var $submitBtn = $newsletterForm.querySelector('#newsletterSignupSubmit');
// Object that contains key values stored in data-attributes
var config =
newsletterPreferenceListNames: JSON.parse(getDataAttribute($newsletterForm, 'newsletterPreferenceListNames')),
siteName: getDataAttribute($newsletterForm, 'newsletterSiteName'),
newsletterUrl: getDataAttribute($newsletterForm, 'newsletterUrl'),
newsletterSuccess: getDataAttribute($newsletterForm, 'newsletterSuccess'),
;
var newsletterData =
siteName: config.siteName
;
function isEmailValid(email) (([a-zA-Z-0-9]+.)+[a-zA-Z]2,))$/;
return re.test(email);
function getDataAttribute(el, attr)
var dataAttr = 'data-' + attr;
if (el.hasAttribute(dataAttr))
var val = el.getAttribute(dataAttr);
el.removeAttribute(dataAttr);
return val;
function getRandomArbitrary(min, max)
var randomNum = Math.random() * ((max - min) + min);
return Math.round(randomNum);
function removeNode(node)
if (node)
node.parentNode.removeChild(node);
function insertAfterNode(el, node)
if (node)
node.parentNode.insertBefore(el, node.nextSibling);
function insertHeadings(pos)
var $heading = document.createElement('h1');
$heading.classList.add('heading');
$heading.innerHTML = config.newsletterPreferenceListNames[pos].title;
$newsletterForm.insertBefore($heading, $newsletterForm.firstChild);
var $subtitle = document.createElement('p');
$subtitle.classList.add('subtitle');
$subtitle.innerHTML = config.newsletterPreferenceListNames[pos].headline;
insertAfterNode($subtitle, $heading);
function displayRandomNewsletter(num)
if($subscriptionForm)
removeNode($subscriptionForm);
$newsletterForm.classList.remove('hidden');
newsletterData.preferenceListName = config.newsletterPreferenceListNames[num].name;
$newsletterForm.querySelector('#newsletterType').value = config.newsletterPreferenceListNames[num].name;
insertHeadings(num);
function removeRandomCTA()
if (isNewsletterEnabled === 'true')
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length -1 );
if ($subscriptionForm && num === 0)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
displayRandomNewsletter(num )
notifyWidgetSelected($newsletterForm);
else
var num = getRandomArbitrary(0, 1);
if (num === 1)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
removeNode($subscriptionForm);
notifyWidgetSelected($newsletterForm);
if($newsletterForm != null)
$newsletterForm.classList.remove('hidden')
function notifyWidgetSelected(widget)
var newEvent = new CustomEvent('cta_widget', detail: widget);
window.dispatchEvent(newEvent);
function enableSubmitBtn()
$submitBtn.classList.remove('disabled');
$submitBtn.disabled = false;
function disableSubmitBtn()
$submitBtn.classList.add('disabled');
$submitBtn.disabled = true;
function showErrorMsg(node, msg)
var div = document.createElement('div');
div.classList.add('errorText');
div.innerHTML = msg;
insertAfterNode(div, node);
function validateNewsletter()
var errorMsg = $newsletterForm.querySelector('.errorText');
if (errorMsg)
errorMsg.remove();
if ($email.classList.contains('error'))
$email.classList.remove('error');
if (!isEmailValid($email.value))
showErrorMsg($email, "Please insert a valid email address!");
$email.classList.add('error');
disableSubmitBtn();
else
enableSubmitBtn();
;
function submitNewsletter(e)
e.preventDefault();
validateNewsletter();
if ($submitBtn.classList.contains('disabled'))
return false;
grecaptcha.execute();
newsletterData.emailAddress = $email.value;
$newsletterForm.setAttribute('data-json', JSON.stringify(newsletterData));
;
function eventHandlers()
$email.addEventListener('change', function (e)
validateNewsletter();
);
$newsletterForm.addEventListener('submit', function (e)
submitNewsletter(e);
);
$submitBtn.addEventListener('click', function (e)
submitNewsletter(e);
);
function init(isNewsletterEnabled)
/* eslint-disable no-undef */
var isLoggedIn = getSubscribedFlag;
/* eslint-enable no-undef */
if (isLoggedIn)
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length - 1);
displayRandomNewsletter(num);
else
removeRandomCTA();
if (isNewsletterEnabled === true)
eventHandlers();
return
init: init
());
/* function enableSubmitBtn(token)
mi.calltoActionCtrl.sendResponse(token);
*/
jQuery(document).ready(function ()
mi.calltoActionCtrl.init(true);
);
A Charlotte Department of Transportation spokeswoman declined to comment about safety issues and referred comment to the companies. The CDOT representative said no information was available about injuries reported so far from scooter use, though the department encourages riders to wear helmets and carefully plan their routes.
“As more and more people rely on and adapt to scooter sharing, we believe that along with proactive education, safe riding and responsible use will ultimately become a natural habit,” said Mary Caroline Pruitt, a spokeswoman for Lime. She pointed out that the company instructs riders to wear helmets with notices through the app and reminders on the scooter itself.
“Safety is our number one priority, and Lime urges riders to always put the safety of others and themselves before anything else when operating any of our vehicles.”
Both the bikes and scooters are operating as part of a pilot program under an agreement with the city that ends this fall. Last November, 2,000 dockless bikes from four companies — Ofo, Lime, Mobike and Spin — hit the Charlotte streets.
One of the companies, Ofo, pulled out of Charlotte in July and several other U.S. cities this year after the company said it had “begun to re-evaluate markets that present obstacles,” without citing specific reasons.
The scooter companies, Bird and Lime, are each allowed to operate up to 400 scooters in Charlotte, under a pilot program that started in late May.
In just a few months, the number of scooter rides has outpaced the number of bike rides. While bikes require pedaling, balancing and, in the summer, sweating, electric scooters propel riders at faster speeds with the flick of a thumb lever.
As of July, people in Charlotte had ridden electric scooters more than 174,000 times, according to the Charlotte Department of Transportation, compared to approximately 173,264 dockless bike rides. That’s despite the bikes having been available in Charlotte for nine months versus less than three for the scooters and there being almost twice as many bikes available.
The data for July, the most recent month available, show bike users took 27,453 trips and rode 19,430 miles.
Electric scooters, on the other hand, accounted for 100,273 trips and a whopping 139,215 miles in the same month.
The average scooter user rode 1.42 miles and spent 13 minutes per ride, according to CDOT. Bikes were ridden an average of about 3/4 miles, with average trip lengths of nine minutes.
Unlike previous bike-sharing options, users leave dockless bikes and scooters wherever they want when their ride is done, and the next user finds their ride with a GPS-enabled app. Riders rent them with an app on their phone.
The bikes and scooters typically cost $1 to unlock, and additional charges are based on the time rented, with scooters costing 15 cents per minute and the bikes costing $1 per hour or 30 minutes.
After the pilot program ends, Charlotte City Council could consider regulations ranging from banning the companies, requiring them to pay permitting fees, limiting the number of operators allowed in the city or restricting where riders can go.
Despite their popularity, the companies have faced questions about regulation and safety.
Riders often don’t wear helmets and are sometimes on sidewalks or in traffic. The electric scooters can top 20 mph going downhill. Bicycles are sometimes left blocking sidewalks, in private yards or even dumped in creeks and ponds.
The scooter companies prompted even more regulatory questions when they started leaving their dockless electric vehicles around the city without permission. Initially, Charlotte officials told them they had to remove their scooters or face confiscation. But the city agreed in the pilot program to see how they would work.
Council member Larken Egleston said Monday that he’s worried about safety. He said he saw a couple riding an electric scooter on Interstate 277 this weekend.
“Someone will die on an e-scooter before the end of this calendar year,” he predicted. “We’ve got to have some rules in place.”
Bird didn’t respond to messages seeking more information Tuesday.
Charlotteans seem to prefer scooting to pedaling.
Both dockless bikes and scooters have exploded in popularity in recent months, with riders zipping around uptown, South End and other close-in neighborhoods. But the latest numbers from the pilot program show electric scooter use has quickly outpaced shared bikes, with scooter users riding more and riding farther.
Their soaring popularity has also prompted more calls for regulation and worries about safety, helmet-less riders and pedestrians being bowled over. At least one major employer, Duke Energy, has barred its employees from using scooters during work hours.
“Even though these items can be tempting to use as a fun, fast means of getting from one location to another, there is also a tremendous amount of risk associated with operating them,” said Duke Energy spokesman Neil Nissan. “Whether they’re walking, riding a bike or driving a car, we’ve asked them to be on the lookout for more people using rental bicycles and scooters.”
var mi = mi || ;
mi.calltoActionCtrl = (function ()
var $subscriptionForm = document.querySelector('#story-cta-widget');
var $newsletterForm = document.querySelector('#newsletter-signUpWidget');
if ($newsletterForm != null)
var isNewsletterEnabled = getDataAttribute($newsletterForm, 'isNewsletterEnabled');
if (isNewsletterEnabled === 'true')
var $email = $newsletterForm.querySelector('#s_email_address');
var $submitBtn = $newsletterForm.querySelector('#newsletterSignupSubmit');
// Object that contains key values stored in data-attributes
var config =
newsletterPreferenceListNames: JSON.parse(getDataAttribute($newsletterForm, 'newsletterPreferenceListNames')),
siteName: getDataAttribute($newsletterForm, 'newsletterSiteName'),
newsletterUrl: getDataAttribute($newsletterForm, 'newsletterUrl'),
newsletterSuccess: getDataAttribute($newsletterForm, 'newsletterSuccess'),
;
var newsletterData =
siteName: config.siteName
;
function isEmailValid(email) (([a-zA-Z-0-9]+.)+[a-zA-Z]2,))$/;
return re.test(email);
function getDataAttribute(el, attr)
var dataAttr = 'data-' + attr;
if (el.hasAttribute(dataAttr))
var val = el.getAttribute(dataAttr);
el.removeAttribute(dataAttr);
return val;
function getRandomArbitrary(min, max)
var randomNum = Math.random() * ((max - min) + min);
return Math.round(randomNum);
function removeNode(node)
if (node)
node.parentNode.removeChild(node);
function insertAfterNode(el, node)
if (node)
node.parentNode.insertBefore(el, node.nextSibling);
function insertHeadings(pos)
var $heading = document.createElement('h1');
$heading.classList.add('heading');
$heading.innerHTML = config.newsletterPreferenceListNames[pos].title;
$newsletterForm.insertBefore($heading, $newsletterForm.firstChild);
var $subtitle = document.createElement('p');
$subtitle.classList.add('subtitle');
$subtitle.innerHTML = config.newsletterPreferenceListNames[pos].headline;
insertAfterNode($subtitle, $heading);
function displayRandomNewsletter(num)
if($subscriptionForm)
removeNode($subscriptionForm);
$newsletterForm.classList.remove('hidden');
newsletterData.preferenceListName = config.newsletterPreferenceListNames[num].name;
$newsletterForm.querySelector('#newsletterType').value = config.newsletterPreferenceListNames[num].name;
insertHeadings(num);
function removeRandomCTA()
if (isNewsletterEnabled === 'true')
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length -1 );
if ($subscriptionForm && num === 0)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
displayRandomNewsletter(num )
notifyWidgetSelected($newsletterForm);
else
var num = getRandomArbitrary(0, 1);
if (num === 1)
removeNode($newsletterForm);
notifyWidgetSelected($subscriptionForm);
$subscriptionForm.classList.remove('hidden');
else
removeNode($subscriptionForm);
notifyWidgetSelected($newsletterForm);
if($newsletterForm != null)
$newsletterForm.classList.remove('hidden')
function notifyWidgetSelected(widget)
var newEvent = new CustomEvent('cta_widget', detail: widget);
window.dispatchEvent(newEvent);
function enableSubmitBtn()
$submitBtn.classList.remove('disabled');
$submitBtn.disabled = false;
function disableSubmitBtn()
$submitBtn.classList.add('disabled');
$submitBtn.disabled = true;
function showErrorMsg(node, msg)
var div = document.createElement('div');
div.classList.add('errorText');
div.innerHTML = msg;
insertAfterNode(div, node);
function validateNewsletter()
var errorMsg = $newsletterForm.querySelector('.errorText');
if (errorMsg)
errorMsg.remove();
if ($email.classList.contains('error'))
$email.classList.remove('error');
if (!isEmailValid($email.value))
showErrorMsg($email, "Please insert a valid email address!");
$email.classList.add('error');
disableSubmitBtn();
else
enableSubmitBtn();
;
function submitNewsletter(e)
e.preventDefault();
validateNewsletter();
if ($submitBtn.classList.contains('disabled'))
return false;
grecaptcha.execute();
newsletterData.emailAddress = $email.value;
$newsletterForm.setAttribute('data-json', JSON.stringify(newsletterData));
;
function eventHandlers()
$email.addEventListener('change', function (e)
validateNewsletter();
);
$newsletterForm.addEventListener('submit', function (e)
submitNewsletter(e);
);
$submitBtn.addEventListener('click', function (e)
submitNewsletter(e);
);
function init(isNewsletterEnabled)
/* eslint-disable no-undef */
var isLoggedIn = getSubscribedFlag;
/* eslint-enable no-undef */
if (isLoggedIn)
var num = getRandomArbitrary(0, config.newsletterPreferenceListNames.length - 1);
displayRandomNewsletter(num);
else
removeRandomCTA();
if (isNewsletterEnabled === true)
eventHandlers();
return
init: init
());
/* function enableSubmitBtn(token)
mi.calltoActionCtrl.sendResponse(token);
*/
jQuery(document).ready(function ()
mi.calltoActionCtrl.init(true);
);
A Charlotte Department of Transportation spokeswoman declined to comment about safety issues and referred comment to the companies. The CDOT representative said no information was available about injuries reported so far from scooter use, though the department encourages riders to wear helmets and carefully plan their routes.
“As more and more people rely on and adapt to scooter sharing, we believe that along with proactive education, safe riding and responsible use will ultimately become a natural habit,” said Mary Caroline Pruitt, a spokeswoman for Lime. She pointed out that the company instructs riders to wear helmets with notices through the app and reminders on the scooter itself.
“Safety is our number one priority, and Lime urges riders to always put the safety of others and themselves before anything else when operating any of our vehicles.”
Both the bikes and scooters are operating as part of a pilot program under an agreement with the city that ends this fall. Last November, 2,000 dockless bikes from four companies — Ofo, Lime, Mobike and Spin — hit the Charlotte streets.
One of the companies, Ofo, pulled out of Charlotte in July and several other U.S. cities this year after the company said it had “begun to re-evaluate markets that present obstacles,” without citing specific reasons.
The scooter companies, Bird and Lime, are each allowed to operate up to 400 scooters in Charlotte, under a pilot program that started in late May.
In just a few months, the number of scooter rides has outpaced the number of bike rides. While bikes require pedaling, balancing and, in the summer, sweating, electric scooters propel riders at faster speeds with the flick of a thumb lever.
As of July, people in Charlotte had ridden electric scooters more than 174,000 times, according to the Charlotte Department of Transportation, compared to approximately 173,264 dockless bike rides. That’s despite the bikes having been available in Charlotte for nine months versus less than three for the scooters and there being almost twice as many bikes available.
The data for July, the most recent month available, show bike users took 27,453 trips and rode 19,430 miles.
Electric scooters, on the other hand, accounted for 100,273 trips and a whopping 139,215 miles in the same month.
The average scooter user rode 1.42 miles and spent 13 minutes per ride, according to CDOT. Bikes were ridden an average of about 3/4 miles, with average trip lengths of nine minutes.
Unlike previous bike-sharing options, users leave dockless bikes and scooters wherever they want when their ride is done, and the next user finds their ride with a GPS-enabled app. Riders rent them with an app on their phone.
The bikes and scooters typically cost $1 to unlock, and additional charges are based on the time rented, with scooters costing 15 cents per minute and the bikes costing $1 per hour or 30 minutes.
After the pilot program ends, Charlotte City Council could consider regulations ranging from banning the companies, requiring them to pay permitting fees, limiting the number of operators allowed in the city or restricting where riders can go.
Despite their popularity, the companies have faced questions about regulation and safety.
Riders often don’t wear helmets and are sometimes on sidewalks or in traffic. The electric scooters can top 20 mph going downhill. Bicycles are sometimes left blocking sidewalks, in private yards or even dumped in creeks and ponds.
The scooter companies prompted even more regulatory questions when they started leaving their dockless electric vehicles around the city without permission. Initially, Charlotte officials told them they had to remove their scooters or face confiscation. But the city agreed in the pilot program to see how they would work.
Council member Larken Egleston said Monday that he’s worried about safety. He said he saw a couple riding an electric scooter on Interstate 277 this weekend.
“Someone will die on an e-scooter before the end of this calendar year,” he predicted. “We’ve got to have some rules in place.”
Bird didn’t respond to messages seeking more information Tuesday.
Take Us With You
Real-time updates and all local stories you want right in the palm of your hand.
Take Us With You
Real-time updates and all local stories you want right in the palm of your hand.
Take Us With You
Real-time updates and all local stories you want right in the palm of your hand.
Take Us With You
Real-time updates and all local stories you want right in the palm of your hand.
Subscriptions
Learn More
Advertising
Clash Royale CLAN TAG#URR8PPP
Comments
jQuery(document).ready(function ()
mi.commentingFaceboook.init();
);